599
技術社區[雲棲]
單例模式-研磨設計模式--單例模式--雙重檢查加鎖(一)
* 雙重檢查加鎖:
* “雙重檢查加鎖“的方式可以既實現線程安全,又能夠使性能不受到很大的影響。
* 那麼什麼是”雙重檢查加鎖“機製呢?
* 所謂雙重檢查加鎖機製,指的是:並不是每次進入getInstance方法都需要同步,
* 而是先不同步,進入方法過後,先檢查實例是否存在,如果不存在才進入下麵的同步塊,
* 這是第一重檢查。進入同步塊後,再次檢查實例是否存在,如果不存在,就在同步的
* 情況下創建一個實例,這是第二重檢查。這樣一來,就隻需要同步一次了,從而減少了
* 多次在同步情況下進行判斷所浪費的時間。
* 雙重檢查加鎖機製的實現會使用一個關鍵字volatile,它的意思是:被volatile
* 修飾的變量的值,將不會被本地線程緩存,所有對該變量的讀寫都是直接操作共享內存,從而
* 確保多個線程能正確的處理該變量。
*
*說明:由於volatile關鍵字可能會屏蔽掉虛擬機中的一些必要的代碼優化,所以運行效率並不是
*很高。因此一般建議,沒有特別的需要,不要使用。也就是說,雖然可以使用”雙重檢查加鎖“
* 機製來實現線程安全的單例,但並不建議大量采用,可以根據情況來選用。
public class Singleton_volatile {
private volatile static Singleton_volatileinstance=null;
private Singleton_volatile(){
}
public static Singleton_volatilegetInstance(){
//先檢查實例是否存在,如果不存在才進入下麵的同步塊
if(instance==null){
//同步塊,線程安全的創建實例
synchronized(Singleton_volatile.class){
//再次檢查實例是否存在,如果不存在才真正的創建實例
if(instance==null){
instance=newSingleton_volatile();
}
}
}
return instance;
}
}
最後更新:2017-04-03 12:55:16