雙重校驗鎖實現(xiàn)單例模式(對象單例,線程安全)

雙重校驗鎖實現(xiàn)單例模式:

創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設(shè)計制作、成都做網(wǎng)站與策劃設(shè)計,解放網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:解放等地區(qū)。解放做網(wǎng)站價格咨詢:028-86922220

public class Singleton {

    //采用volatile修飾
    private volatile static Singleton singleton;

    //構(gòu)造方法私有化
    private Singleton(){}

    //雙重校驗鎖
    public static Singleton getInstance(){
        //先判斷對象是否已經(jīng)實例過,沒有實例化過才進入加鎖代碼
        if(singleton == null){
            //類對象加鎖
            synchronized(Singleton.class){
                //再次判斷
                if (singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

注意:singleton 采用 volatile 修飾是很有必要的,因為 singleton = new Singleton() 這句話可以分為三步:

  1. 為 singleton 分配內(nèi)存空間;
  2. 初始化 singleton;
  3. 將 singleton 指向分配的內(nèi)存空間。
    但是由于JVM具有指令重排的特性,執(zhí)行順序有可能變成 1-3-2。 指令重排在單線程下不會出現(xiàn)問題,但是在多線程下會導(dǎo)致一個線程獲得一個未初始化的實例。例如:線程T1執(zhí)行了1和3,此時T2調(diào)用 getInstance() 后發(fā)現(xiàn) singleton 不為空,因此返回 singleton, 但是此時的 singleton 還沒有被初始化。
    使用 volatile 會禁止JVM指令重排,從而保證在多線程下也能正常執(zhí)行

當(dāng)前題目:雙重校驗鎖實現(xiàn)單例模式(對象單例,線程安全)
網(wǎng)站URL:http://bm7419.com/article2/ppheic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、面包屑導(dǎo)航、營銷型網(wǎng)站建設(shè)、網(wǎng)站營銷、軟件開發(fā)、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)