成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

單例模式的雙重判否

anonymoussf / 984人閱讀

摘要:概述在單例模式的懶漢模式中,方法通常是采用如下方式寫的這樣的寫法在多線程的情況下有可能造成不同的線程都實例化了一個對象出來,所以該寫法是線程不安全的。全部代碼這是普通模式這是同步模式這是雙重判否模式

概述

在單例模式的懶漢模式中,getInstance方法通常是采用如下方式寫的:

public static STest getInstance(){
    if(sTest==null){
        sTest = new STest();
    }
    return sTest;
}

這樣的寫法在多線程的情況下有可能造成不同的線程都實例化了一個對象出來,所以該寫法是線程不安全的。那么怎么辦呢?

加鎖的解決方法

首先,自然想到既然線程不安全的原因是多個線程可能同時執(zhí)行方法,那么加鎖肯定是一個不錯的解決方案,

public static synchronized STest getInstance2(){
    if(sTest==null){
        sTest = new STest();
    }
    return sTest;
}

這樣在一定程度上的確能保證多線程下的安全,但是如果多個線程都要調(diào)用該方法,然后都要等待排在前面的線程去判斷sTest對象是否為空,在效率上落了下乘。所以為了兼顧安全和效率,有了雙重判否的解決方式。

雙重判否

雙重判否并不是每次進(jìn)入getInstance方法都需要同步,而是先不同步,進(jìn)入方法過后,先檢查實例是否存在,如果不存在才進(jìn)入下面的同步塊,這是第一重檢查。進(jìn)入同步塊后,再次檢查實例是否存在,如果不存在,就在同步的情況下創(chuàng)建一個實例,這是第二重檢查。這樣一來,就只需要同步一次了,從而減少了多次在同步情況下進(jìn)行判斷所浪費(fèi)的時間。
雙重檢查加鎖機(jī)制的實現(xiàn)會使用一個關(guān)鍵字volatile,它的意思是:被volatile修飾的變量的值,將不會被本地線程緩存,所有對該變量的讀寫都是直接操作共享內(nèi)存,從而確保多個線程能正確的處理該變量。

全部代碼
package Test0328;

/**
 * Created by Cesar on 2016/3/28.
 */
public class STest {
    private static volatile STest sTest;

    private STest() {
    }

    /**
     * 這是普通模式
     *
     * @return
     */
    public static STest getInstance() {
        if (sTest == null) {
            sTest = new STest();
        }
        return sTest;
    }

    /**
     * 這是同步模式
     *
     * @return
     */
    public static synchronized STest getInstance2() {
        if (sTest == null) {
            sTest = new STest();
        }
        return sTest;
    }

    /**
     * 這是雙重判否模式
     *
     * @return
     */
    public static STest getInstance1() {
        if (sTest == null) {
            synchronized (STest.class) {
                if (sTest == null) {
                    sTest = new STest();
                }
            }
        }
        return sTest;
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65672.html

相關(guān)文章

  • Java 雙重加鎖單例與 java 內(nèi)存重排序特性

    摘要:關(guān)于對于重排序的講解,強(qiáng)烈推薦閱讀程曉明寫的深入理解內(nèi)存模型二重排序。語義語義單線程下,為了優(yōu)化可以對操作進(jìn)行重排序。編譯器和處理器為單個線程實現(xiàn)了語義,但對于多線程并不實現(xiàn)語義。雙重加載的單例模式分析即雙重檢查加鎖。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請注明出處:https://segmentfault.com/a/1190000009231182 1. 引言 在開始分析雙重加鎖單...

    HackerShell 評論0 收藏0
  • 深入理解單例模式

    摘要:總結(jié)我們主要介紹到了以下幾種方式實現(xiàn)單例模式餓漢方式線程安全懶漢式非線程安全和關(guān)鍵字線程安全版本懶漢式雙重檢查加鎖版本枚舉方式參考設(shè)計模式中文版第二版設(shè)計模式深入理解單例模式我是一個以架構(gòu)師為年之內(nèi)目標(biāo)的小小白。 初遇設(shè)計模式在上個寒假,當(dāng)時把每個設(shè)計模式過了一遍,對設(shè)計模式有了一個最初級的了解。這個學(xué)期借了幾本設(shè)計模式的書籍看,聽了老師的設(shè)計模式課,對設(shè)計模式算是有個更進(jìn)一步的認(rèn)識。...

    FuisonDesign 評論0 收藏0
  • 設(shè)計模式系列之單例模式

    摘要:下面我們來看看看中的單例模式,中使用的是單例注冊表的特殊方式實現(xiàn)的單例模式,所以說模式是死的,需要靈活得運(yùn)用。 本文循序漸進(jìn)介紹單例模式的幾種實現(xiàn)方式,以及Jdk中使用到單例模式的例子,以及sring框架中使用到的單例模式例子。 餓漢式 package signgleton; /** * 單例模式簡單的實現(xiàn) */ public class Singleton { priv...

    Jason 評論0 收藏0
  • #yyds干貨盤點(diǎn)#設(shè)計模式之【單例模式

    摘要:枚舉推薦優(yōu)點(diǎn)懶加載,線程安全,效率高,大牛推薦作者推薦總結(jié)關(guān)于單例模式的實現(xiàn)方式,首推的就是枚舉,其次是懶漢模式雙重檢查,最后是靜態(tài)內(nèi)部類 作者:湯圓個人博客:javalover.cc前言有時候我們的類并不需要很多個實例,在程序運(yùn)行期間,可能只需要一個實例就夠了,多了反而會出現(xiàn)數(shù)據(jù)不一致的問題;這時候我們就可以...

    sourcenode 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<