[23]單例模式懶漢式併發安全問題
阿新 • • 發佈:2018-11-12
一、餓漢式
/*餓漢式*/
class SingleTon{
private SingleTon single=new Single();
public SingleTon getInstance(){
return s;
}
}
餓漢式的是共同物件,但是因為沒有多次運算。所以不會多執行緒時,不會產生資料出錯。
二、懶漢式
class SingleTon{ private SingleTon single=null; public SingleTon getInstance(){ if(single==null){ single=new SingleTon(); } return s; } }
懶漢式的是共同物件,但是有多次運算,在多執行緒時,會產生資料出錯。所以要用同步。
class SingleTon{
private SingleTon single=null;
public synchronized SingleTon getInstance(){
if(single==null){
single=new SingleTon();
}
return single;
}
}
可以解決問題,但是因為synchronized修飾方法的話,每次需要獲取物件,都要爭奪鎖。導致資源浪費,效能降低。
那麼加一句判斷即可。
class SingleTon{ private SingleTon single=null; public SingleTon getInstance(){ /*這個if無論有沒有加上同步,都要進行判斷的。*/ if(single==null){ /*如果null那麼就建立例項。之後接下來的只要判斷是不是null,只要不是統統就不用再進入同步鎖*/ synchronized(single){ if(single==null){ single=new Single(); } } } return single; } }
雖說提高效能。但是繁瑣,容易出錯。實際開發中,使用餓漢式。因為只要用到了單例,都要建立物件。那麼直接使用餓漢式,不僅不會出現問題,而且程式碼相對於簡化。