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