個人專題目錄
1.懶加載 線程不安全
當被問到要實現(xiàn)一個單例模式時低斋,很多人的第一反應(yīng)是寫出如下的代碼盈蛮,包括教科書上也是這樣教我們的镐侯。
public class Singleton {
private static Singleton uniqueInstance;
private Singleton (){}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
這段代碼簡單明了呵燕,而且使用了懶加載模式,但是卻存在致命的問題貌夕。當有多個線程并行調(diào)用 getInstance() 的時候律歼,就會創(chuàng)建多個實例。也就是說在多線程下不能正常工作啡专。
2.懶加載 線程安全
為了解決上面的問題,最簡單的方法是將整個 getInstance() 方法設(shè)為同步(synchronized)制圈。
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
雖然做到了線程安全们童,并且解決了多實例的問題,但是它并不高效鲸鹦。因為在任何時候只能有一個線程調(diào)用 getInstance() 方法慧库。但是同步操作只需要在第一次調(diào)用時才被需要,即第一次創(chuàng)建單例實例對象時馋嗜。這就引出了雙重檢驗鎖齐板。