研磨設計模式 單例模式 雙重檢查加鎖

2021-07-11 11:45:08 字數 721 閱讀 8606

* 雙重檢查加鎖:

* 「雙重檢查加鎖「的方式可以既實現執行緒安全,又能夠使效能不受到很大的影響。

* 那麼什麼是」雙重檢查加鎖「機制呢?

*  所謂雙重檢查加鎖機制,指的是:並不是每次進入getinstance方法都需要同步,

* 而是先不同步,進入方法過後,先檢查例項是否存在,如果不存在才進入下面的同步塊,

* 這是第一重檢查。進入同步塊後,再次檢查例項是否存在,如果不存在,就在同步的

* 情況下建立乙個例項,這是第二重檢查。這樣一來,就只需要同步一次了,從而減少了

* 多次在同步情況下進行判斷所浪費的時間。

*  雙重檢查加鎖機制的實現會使用乙個關鍵字volatile,它的意思是:被volatile

* 修飾的變數的值,將不會被本地執行緒快取,所有對該變數的讀寫都是直接操作共享記憶體,從而

* 確保多個執行緒能正確的處理該變數。

** 說明:由於volatile關鍵字可能會遮蔽掉虛擬機器中的一些必要的**優化,所以執行效率並不是

* 很高。因此一般建議,沒有特別的需要,不要使用。也就是說,雖然可以使用」雙重檢查加鎖「

* 機制來實現執行緒安全的單例,但並不建議大量採用,可以根據情況來選用。

public class singleton_volatile

public static singleton_volatile getinstance()}}

return instance;}}

單例模式之雙重檢查

在實現單例模式時,如果未考慮多執行緒的情況,就容易寫出下面的錯誤 public class singleton public singleton getinstance return uniquesingleton 在多執行緒的情況下,這樣寫可能會導致uniquesingleton有多個例項。比如下...

單例模式的雙重檢查

單例模式 public class singleton public static singleton getinstance return uniqueinstance 其中有兩次判斷是否為空的語句,第一次是為了提高效率,避免每次都要執行同步 塊,第二次判空,是為了避免多執行緒帶來的不安全,當兩個...

單例模式 雙重檢查鎖

單例模式分為餓漢式和懶漢式。餓漢式是事先分配記憶體,提前建立。這樣的方式為到位占用資源,當這種比較多時,會占用很多記憶體。懶漢式是在被呼叫的時候進行。這種在併發時又會導致問題。比較穩妥的辦法是在懶漢式的基礎上加上鎖,然後進行雙重檢查,這種springioc容器式單例也是用這種雙重檢查來避免執行緒衝突...