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