中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java單例模式怎么寫

發布時間:2022-01-05 11:40:46 來源:億速云 閱讀:128 作者:iii 欄目:大數據

本篇內容主要講解“Java單例模式怎么寫”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java單例模式怎么寫”吧!

這個模式是很有意思,而且比較簡單,但是我還是要說因為它使用的是如此的廣泛,如此的有人緣,單例就是單一、獨苗的意思,那什么是獨一份呢?你的思維是獨一份,除此之外還有什么不能山寨的呢?我們舉個比較難復制的對象:皇帝

中國的歷史上很少出現兩個皇帝并存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在這個場景中,有皇帝,有大臣,大臣是天天要上朝參見皇帝的,今天參拜的皇帝應該和昨天、前天的一樣(過渡期的不考慮,別找茬哦),大臣磕完頭,抬頭一看,嗨,還是昨天那個皇帝,單例模式,絕對的單例模式,先看類圖:

然后我們看程序實現,先定一個皇帝:

package com.cbf4life.singleton1;


/**
*中國的歷史上一般都是一個朝代一個皇帝,有兩個皇帝的話,必然要PK出一個皇帝出來
*/

public class Emperor {
       private static Emperor emperor = null;	//定義一個皇帝放在那里,然后給這個皇帝名字
       private Emperor(){
        //世俗和道德約束你,目的就是不讓你產生第二個皇帝
        }
        public static Emperor getInstance(){
            if(emperor == null){	//如果皇帝還沒有定義,那就定一個
                emperor = new Emperor();
            }
            return emperor;
        }

    //皇帝叫什么名字呀
    public static void emperorInfo(){
        System.out.println("我就是皇帝某某某....");
    }

}

然后定義大臣:

package com.cbf4life.singleton1;
/**
*大臣是天天要面見皇帝,今天見的皇帝和昨天的,前天不一樣那就出問題了!
*/

@SuppressWarnings("all")
public class Minister {
        public static void main(String[] args) {
            //第一天
            Emperor	emperor1=Emperor.getInstance();
            emperor1.emperorInfo();	//第一天見的皇帝叫什么名字呢?

            //第二天
            Emperor emperor2=Emperor.getInstance(); Emperor.emperorInfo();

            //第三天
            Emperor emperor3=Emperor.getInstance(); emperor2.emperorInfo();
            //三天見的皇帝都是同一個人,榮幸吧!
        }
}

看到沒,大臣天天見到的都是同一個皇帝,不會產生錯亂情況,反正都是一個皇帝,是好是壞就這一個,只要提到皇帝,大家都知道指的是誰,清晰,而又明確。問題是這是通常情況,還有個例的,如同一個時期同一個朝代有兩個皇帝,怎么辦?

單例模式很簡單,就是在構造函數中多了加一個構造函數,訪問權限是 private 的就可以了,這個模式是簡單,但是簡單中透著風險,風險?什么風險?在一個 B/S 項目中,每個 HTTP Request 請求到 J2EE 的容器上后都創建了一個線程,每個線程都要創建同一個單例對象,怎么辦?,好,我們寫一個通用的單例程序,然后分析一下:

package com.cbf4life.singleton3;
/**
*通用單例模式
*/
@SuppressWarnings("all")
    public class SingletonPattern {
        private static SingletonPattern singletonPattern= null;
        //限制住不能直接產生一個實例
        private SingletonPattern(){
        }

        public SingletonPattern getInstance(){
            if(this.singletonPattern == null){	//如果還沒有實例,則創建一個
                this.singletonPattern = new SingletonPattern();
            }
            return this.singletonPattern;
        }
}

我們來看黃色的那一部分,假如現在有兩個線程 A 和線程 B,線程 A 執行到 this.singletonPattern = new SingletonPattern(),正在申請內存分配,可能需要 0.001 微秒,就在這 0.001 微秒之內,線程 B 執行到 if(this.singletonPattern == null),你說這個時候這個判斷條件是 true 還是 false?是 true,那然后呢?線程 B 也往下走,于是乎就在內存中就有兩個 SingletonPattern 的實例了,看看是不是出問題了?

如果你這個單例是去拿一個序列號或者創建一個信號資源的時候,會怎么樣?業務邏輯混亂!數據一致性校驗失敗!最重要的是你從代碼上還看不出什么問題,這才是最要命的!因為這種情況基本上你是重現不了的,不寒而栗吧,那怎么修改?有很多種方案,我就說一種,能簡單的、徹底解決問題的方案:

package com.cbf4life.singleton3;
/**
*通用單例模式
*/
@SuppressWarnings("all")
    public class SingletonPattern {
        private static final SingletonPattern singletonPattern= new   SingletonPattern();

        //限制住不能直接產生一個實例
        private SingletonPattern(){
        }

        public synchronized static SingletonPattern getInstance(){ return singletonPattern;
        }
}

直接 new 一個對象傳遞給類的成員變量 singletonpattern,你要的時候 getInstance()直接返回給你,解決問題!

到此,相信大家對“Java單例模式怎么寫”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄浦区| 灵山县| 健康| 西乌| 临泉县| 澎湖县| 南安市| 靖远县| 于田县| 许昌市| 玛曲县| 扬州市| 丰都县| 延吉市| 韶山市| 北海市| 元阳县| 鲁甸县| 广宁县| 揭阳市| 霍邱县| 牡丹江市| 宁化县| 香河县| 阿克| 察雅县| 余干县| 牙克石市| 武安市| 昆明市| 株洲市| 高碑店市| 姚安县| 晋江市| 昭平县| 临城县| 唐河县| 灵武市| 崇礼县| 昌邑市| 镇雄县|