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

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

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

public class Singleton {

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

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

    //雙重校驗(yàn)鎖
    public static Singleton getInstance(){
        //先判斷對(duì)象是否已經(jīng)實(shí)例過(guò),沒(méi)有實(shí)例化過(guò)才進(jìn)入加鎖代碼
        if(singleton == null){
            //類(lèi)對(duì)象加鎖
            synchronized(Singleton.class){
                //再次判斷
                if (singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

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

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

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

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

廣告

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

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