懶漢式的延遲加載可以解決線程安全和節省內存,但又會引起性能不足。
按照上一篇文章的代碼,a,b多個線程執行情況下,如果a先進入了方法處於允許狀態,那b線程則只能處於監聽狀態。
通過調式效果如下
之前是讓其他線程在方法外面待着,那是否可以讓它們也先進方法裏面來等待呢?這就跟餐廳排隊等一樣,站在外面風吹日曬,不如先讓顧客進大廳進行排隊。
代碼改版後的2.1
public class LazySingletion {
private LazySingletion(){
}
private static LazySingletion single;
protected static LazySingletion getInstance(){
synchronized(LazySingletion.class){
if(single == null ){
single = new LazySingletion();
}
}
return single;
}
}
這裏有人會產生疑問,這換湯不換藥啊,還是需要等待。所以這段代碼還有改進的餘地。
改進思路:1.可以先判斷是否已經存纔對象,再來考慮是否排隊
2.2版本
public class LazySingletion {
private LazySingletion(){
}
private volatile static LazySingletion single;
protected static LazySingletion getInstance(){
if(single == null){
synchronized(LazySingletion.class){
if(single == null ){
single = new LazySingletion();
}
}
}
return single;
}
}
爲了避免執行重排序問題,這裏可以加了一個關鍵字 volatile