雙重檢查加鎖單例:volatile,synchronized

  • 雙重檢查加鎖:
  • “雙重檢查加鎖“的方式可以既實現線程安全,又能夠使性能不受到很大的影響。
  • 那么什么是”雙重檢查加鎖“機制呢?
  •    所謂雙重檢查加鎖機制,指的是:并不是每次進入getInstance方法都需要同步,
    
  • 而是先不同步,進入方法過后,先檢查實例是否存在,如果不存在才進入下面的同步塊,
  • 這是第一重檢查。進入同步塊后,再次檢查實例是否存在,如果不存在,就在同步的
  • 情況下創建一個實例,這是第二重檢查。這樣一來,就只需要同步一次了,從而減少了
  • 多次在同步情況下進行判斷所浪費的時間。
  •   雙重檢查加鎖機制的實現會使用一個關鍵字volatile,它的意思是:被volatile
    
  • 修飾的變量的值,將不會被本地線程緩存,所有對該變量的讀寫都是直接操作共享內存,從而
  • 確保多個線程能正確的處理該變量。
  • 說明:由于volatile關鍵字可能會屏蔽掉虛擬機中的一些必要的代碼優化,所以運行效率并不是
  • 很高。因此一般建議,沒有特別的需要,不要使用。也就是說,雖然可以使用”雙重檢查加鎖“
  • 機制來實現線程安全的單例,但并不建議大量采用,可以根據情況來選用。

public class Singleton_volatile {
    
 private volatile static Singleton_volatile instance=null;
 private Singleton_volatile(){
  
 }
 public static Singleton_volatile getInstance(){
  //先檢查實例是否存在,如果不存在才進入下面的同步塊
  if(instance==null){
   //同步塊,線程安全的創建實例
   synchronized(Singleton_volatile.class){
    //再次檢查實例是否存在,如果不存在才真正的創建實例
    if(instance==null){
     instance=new Singleton_volatile();
    }
   }
  }
  return instance;
 }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容