摘要:概述在單例模式的懶漢模式中,方法通常是采用如下方式寫的這樣的寫法在多線程的情況下有可能造成不同的線程都實(shí)例化了一個(gè)對(duì)象出來,所以該寫法是線程不安全的。全部代碼這是普通模式這是同步模式這是雙重判否模式
概述
在單例模式的懶漢模式中,getInstance方法通常是采用如下方式寫的:
public static STest getInstance(){ if(sTest==null){ sTest = new STest(); } return sTest; }
這樣的寫法在多線程的情況下有可能造成不同的線程都實(shí)例化了一個(gè)對(duì)象出來,所以該寫法是線程不安全的。那么怎么辦呢?
加鎖的解決方法首先,自然想到既然線程不安全的原因是多個(gè)線程可能同時(shí)執(zhí)行方法,那么加鎖肯定是一個(gè)不錯(cuò)的解決方案,
public static synchronized STest getInstance2(){ if(sTest==null){ sTest = new STest(); } return sTest; }
這樣在一定程度上的確能保證多線程下的安全,但是如果多個(gè)線程都要調(diào)用該方法,然后都要等待排在前面的線程去判斷sTest對(duì)象是否為空,在效率上落了下乘。所以為了兼顧安全和效率,有了雙重判否的解決方式。
雙重判否雙重判否并不是每次進(jìn)入getInstance方法都需要同步,而是先不同步,進(jìn)入方法過后,先檢查實(shí)例是否存在,如果不存在才進(jìn)入下面的同步塊,這是第一重檢查。進(jìn)入同步塊后,再次檢查實(shí)例是否存在,如果不存在,就在同步的情況下創(chuàng)建一個(gè)實(shí)例,這是第二重檢查。這樣一來,就只需要同步一次了,從而減少了多次在同步情況下進(jìn)行判斷所浪費(fèi)的時(shí)間。
雙重檢查加鎖機(jī)制的實(shí)現(xiàn)會(huì)使用一個(gè)關(guān)鍵字volatile,它的意思是:被volatile修飾的變量的值,將不會(huì)被本地線程緩存,所有對(duì)該變量的讀寫都是直接操作共享內(nèi)存,從而確保多個(gè)線程能正確的處理該變量。
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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/65672.html
摘要:關(guān)于對(duì)于重排序的講解,強(qiáng)烈推薦閱讀程曉明寫的深入理解內(nèi)存模型二重排序。語義語義單線程下,為了優(yōu)化可以對(duì)操作進(jìn)行重排序。編譯器和處理器為單個(gè)線程實(shí)現(xiàn)了語義,但對(duì)于多線程并不實(shí)現(xiàn)語義。雙重加載的單例模式分析即雙重檢查加鎖。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請(qǐng)注明出處:https://segmentfault.com/a/1190000009231182 1. 引言 在開始分析雙重加鎖單...
摘要:總結(jié)我們主要介紹到了以下幾種方式實(shí)現(xiàn)單例模式餓漢方式線程安全懶漢式非線程安全和關(guān)鍵字線程安全版本懶漢式雙重檢查加鎖版本枚舉方式參考設(shè)計(jì)模式中文版第二版設(shè)計(jì)模式深入理解單例模式我是一個(gè)以架構(gòu)師為年之內(nèi)目標(biāo)的小小白。 初遇設(shè)計(jì)模式在上個(gè)寒假,當(dāng)時(shí)把每個(gè)設(shè)計(jì)模式過了一遍,對(duì)設(shè)計(jì)模式有了一個(gè)最初級(jí)的了解。這個(gè)學(xué)期借了幾本設(shè)計(jì)模式的書籍看,聽了老師的設(shè)計(jì)模式課,對(duì)設(shè)計(jì)模式算是有個(gè)更進(jìn)一步的認(rèn)識(shí)。...
摘要:下面我們來看看看中的單例模式,中使用的是單例注冊(cè)表的特殊方式實(shí)現(xiàn)的單例模式,所以說模式是死的,需要靈活得運(yùn)用。 本文循序漸進(jìn)介紹單例模式的幾種實(shí)現(xiàn)方式,以及Jdk中使用到單例模式的例子,以及sring框架中使用到的單例模式例子。 餓漢式 package signgleton; /** * 單例模式簡單的實(shí)現(xiàn) */ public class Singleton { priv...
摘要:枚舉推薦優(yōu)點(diǎn)懶加載,線程安全,效率高,大牛推薦作者推薦總結(jié)關(guān)于單例模式的實(shí)現(xiàn)方式,首推的就是枚舉,其次是懶漢模式雙重檢查,最后是靜態(tài)內(nèi)部類 作者:湯圓個(gè)人博客:javalover.cc前言有時(shí)候我們的類并不需要很多個(gè)實(shí)例,在程序運(yùn)行期間,可能只需要一個(gè)實(shí)例就夠了,多了反而會(huì)出現(xiàn)數(shù)據(jù)不一致的問題;這時(shí)候我們就可以...
閱讀 1010·2023-04-25 14:45
閱讀 2792·2021-09-30 09:59
閱讀 3132·2021-09-22 15:48
閱讀 2432·2019-08-30 15:55
閱讀 3487·2019-08-30 15:44
閱讀 551·2019-08-29 14:07
閱讀 3420·2019-08-26 13:45
閱讀 546·2019-08-26 11:31