GitHub Demo 傳送門
懶漢式-雙重校驗
示例代碼
public class Single03 {
private static volatile Single03 INSTANCE;
private Single03(){
}
/**
* 通過兩個判斷進行檢測,保證線程安全
* @return
*/
public static Single03 getInstance(){
if(INSTANCE == null){
synchronized (Single03.class){
if (INSTANCE == null){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
INSTANCE = new Single03();
}
}
}
return INSTANCE;
}
}
輸出示例
上述方式,還是針對多線程下的單例模式處理。雙重校驗與文章(一)懶漢模式的區別在於
1、我們不在是對整個方法加鎖,而是在需要的時候進行加鎖
2、我們通過雙重判斷,判斷對象是否創建。如已創建,直接釋放鎖。
懶漢式-靜態內部類
單例中優美的實現方式
示例代碼
public class Single04 {
private Single04() {
}
private static class Single04Holder {
private static final Single04 INSTANCE = new Single04();
}
public static Single04 getInstance() {
return Single04Holder.INSTANCE;
}
}
輸出示例
靜態內部內的形式,優美的解決了如下兩個問題
1、解決什麼時候用什麼時候加載的問題
2、解決線程安全的問題
通過兩篇文章對單例模式進行了解讀,希望能給大家做個引導。