1. 程式人生 > >多執行緒核心技術-單例模式

多執行緒核心技術-單例模式

單例模式在設計模式中比較常見,在多執行緒訪問的時候容易出現執行緒不安全的隱患

懶漢式(延遲載入)/餓漢式(立即載入)

直接給出雙檢查鎖單例模式

public class Singleton {   
     private static Singleton instance;   
     private Singleton (){ 
     }    
     public static Singleton getInstance(){    
       if (instance == null){ 
           synchronized(Singleton.class){ 
               if (instance == null) 
                   instance = new Singleton();  
           } 
       } 
       return instance; 
     } 
    
 } 
問題根源在此:new物件可拆分成3個指令執行                     1、memory = allocate() //分配記憶體
                     2、ctorInstance(memory) //初始化物件
                     3、instance = memory //instance指向剛分配的記憶體地址
其中2和3可能會指令重排,如果發生指令重排,先執行了指令3,此時執行緒2執行第一個if判斷時就是false,此時直接返回一個沒有初始化的instance物件,導致系統錯誤
所以應加上volatile禁止重排序
public class Singleton {   
     private volatile static Singleton instance;   
     private Singleton (){ 
     }    
     public static Singleton getInstance(){    
       if (instance == null){ 
           synchronized(Singleton.class){ 
               if (instance == null) 
                   instance = new Singleton();  
           } 
       } 
       return instance; 
     } 
    
 }


相關推薦

執行核心技術-模式

單例模式在設計模式中比較常見,在多執行緒訪問的時候容易出現執行緒不安全的隱患懶漢式(延遲載入)/餓漢式(立即載入)直接給出雙檢查鎖單例模式public class Singleton { private static Singleton instance;

水滴石穿--執行原子操作、threadlocal、volatile、執行下的模式

接著上一篇文章,下面看看幾個比較好理解的知識點!! volatile java關鍵字volatile修飾的變數從字面意義上理解易變的,不穩定的,事實上時告訴編譯器該變數是易變的不要對該變數使用快取等級的優化,每次都從記憶體地址中讀取值。 不過並沒有說明在對volatile修飾的變數進行修

java叢集優化——執行下的模式

        在最初學習設計模式時,我為絕佳的設計思想激動不已,在以後的工程中,多次融合設計模式,而在當下的設計中,我們已經覺察出了當初設計模式的高瞻遠矚,但是也有一些不足,需要我們去改進,有人說過

Java執行知識點總結——進階篇(五)之執行下的模式

餓漢式 餓漢式多執行緒和單執行緒的程式碼是一樣的,如下: class Single { private static final Single s = new Single(); p

C# 執行執行下的模式的實現

該單例模式是執行緒不安全的,只能在單執行緒下執行,在多執行緒中如果被兩個執行緒同時呼叫Instance屬性時,此時兩個執行緒判斷 if (_instance==null)時都會返回true,就會建立兩個例項。public class Singleton{ /// <

執行下的模式

簡介: 保證一個類僅有一個例項,並提供一個該例項的全域性訪問點。《設計模式》GoF 動機 在軟體系統中,經常有這樣一個特殊的類,必須保證它們在系統中只存在一個示例,才能確保它們的邏輯正確性、以及良好的效率。這個應該類設計者的責任,而不是使用者的

一種執行安全的模式

template <typename T> class StaticSingletonT { public: static T* SafeInstance() { static T* s_instance_ptr = NULL; if (!s_i

Java基礎:執行下的模式

       單例物件(Singleton)是一種常用的設計模式。在Java應用中,單例物件能保證在一個JVM中,該物件只有一個例項存在。但在多執行緒環境下,就可能會產生問題,並不一定能保證只有一個例項。具體問題描述和解決方法如下。 /* * 多執行緒下

python執行安全的模式

    常用的軟體設計模式有23種,單例模式便是其中的一種。那麼在面向過程的語言中,我們常常用到全域性變數。其實單例模式和全域性變數在某種意義上來說近似。譬如我們要讀取某些配置檔案,有一個專門的類來封裝好了,但是如果不用單例模式,會造成程式例項化很多配置檔案類的物件,這樣的話

c++靜態程式碼實現執行安全的模式

開發十年,就只剩下這套架構體系了! >>>   

Java執行核心技術(五)模式執行

本文只需要考慮一件事:如何使單例模式遇到多執行緒是安全的、正確的 1.立即載入 / "餓漢模式" 什麼是立即載入?立即載入就是使用類的時候已經將物件建立完畢,常見的實現辦法就是直接 new 例項化。 public class MyObject { private static MyObject m

執行核心技術】---模式執行

立即載入/“餓漢模式”    立即載入就是在使用類的時候已經將物件建立完畢,常見的實現辦法就是直接new例項化。立即載入/“餓漢模式”    延遲載入就是在呼叫get()方法時例項化才被建立,常見的實現方式就是在get()方法中進行new()例項化,    在多執行緒環境下會

Qt中實現執行安全的模式

之前專案中用到單例模式,用的是執行緒不安全的,這次專案用到了多執行緒,所以想到實現一個執行緒安全的單例模式。經過查詢資料,發現Qt本身有自己的執行緒安全單例模式實現方式。 Q_GLOBAL_STATIC巨集 使用方法:MonitorWindow.h #ifndef MONITORW

Java中執行安全的模式

Java中執行緒安全的單例 深入研究Servlet執行緒安全性問題 來源:網路整理 作者:2017年12月01日 14:03 0 分享 訂閱 關鍵詞:Servlet執行緒     Servlet(Server Applet)是Java Servle

python 實現執行安全的模式

單例模式是一種常見的設計模式,該模式的主要目的是確保某一個類只有一個例項存在。當你希望在整個系統中,某個類只能出現一個例項時,單例物件就能派上用場。 比如,伺服器的配置資訊寫在一個檔案中online.conf中,客戶端通過一個 Config 的類來讀取配置檔案的內容。如果在

Java執行核心技術(四)Lock的使用

本文主要介紹使用Java5中Lock物件也能實現同步的效果,而且在使用上更加方便。 本文著重掌握如下2個知識點: ReentrantLock 類的使用。 ReentrantReadWriteLock 類的使用。 1. 使用ReentrantLock 類 在Java多執行緒中,可以使用 synchron

Java執行核心技術(六)執行組與執行異常

本文應注重掌握如下知識點: 執行緒組的使用 如何切換執行緒狀態 SimpleDataFormat 類與多執行緒的解決辦法 如何處理執行緒的異常 1.執行緒的狀態 執行緒物件在不同執行時期有不同的狀態,狀態資訊就處於State列舉類中,如圖所示: 執行緒狀態 初始(NEW):新建立了一個執行緒物件,但還

面試-執行安全的模式

在一次面試過程中,面試官提到設計模式中單例模式,並要求我手寫一個,於是我馬上寫出一個懶漢式-單例模式,如: public class SingleDemo{ private SingleDemo singleDemo = null; private Single

類的執行下實現

    這兩天在看自己之前寫的程式碼,所以正好把用過的東西整理一下,單例模式,在日常的程式碼工作中也是經常被用到, 所以這裡把之前用過的不同方式實現的單例方式整理一下  

從ConcurrentHashMap的演進看Java執行核心技術

執行緒不安全的HashMap 眾所周知,HashMap是非執行緒安全的。而HashMap的執行緒不安全主要體現在resize時的死迴圈及使用迭代器時的fast-fail上。 注:本章的程式碼均基於JDK 1.7.0_67 HashMap工作原理 HashMap資料結構