閱讀599 返回首頁    go 技術社區[雲棲]


單例模式-研磨設計模式--單例模式--雙重檢查加鎖(一)

* 雙重檢查加鎖:
 * “雙重檢查加鎖“的方式可以既實現線程安全,又能夠使性能不受到很大的影響。
 * 那麼什麼是”雙重檢查加鎖“機製呢?
 *       所謂雙重檢查加鎖機製,指的是:並不是每次進入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

  上一篇:go MySQL導入亂碼解決
  下一篇:go 設計模式之訪問者模式