/**
餓漢式單例模式-不會出現執行緒安全模式
*/public class singletonhunger
//類載入時就產生了instance物件
private static singletonhunger instance = new singletonhunger();
public static singletonhunger getinstance()
}
餓漢式單例模式的優缺點:
優點:類載入時產生instance,沒有對資源進行費原子性操作,所以不會出現安全問題.
缺點:載入過多無用例項
//出現了非原子性操作-會有多執行緒安全問題
public class singletonlazy1
private static volatile singletonlazy1 instance;
//這裡出現了非原子性操作-會有多執行緒問題
public static singletonlazy1 getinstance()
return instance;
}}
singletonlazy1_2:更明顯的執行緒安全問題
/**
* 懶漢式1-2-更明顯的執行緒安全問題(sleep了10ms)
*/public class singletonlazy1_2
private static volatile singletonlazy1_2 instance;
//這裡出現了非原子性操作-會有多執行緒問題
public static singletonlazy1_2 getinstance() catch (interruptedexception e)
instance = new singletonlazy1_2();
} return instance;
}}
public class singletonlazy2
private static volatile singletonlazy2 instance;
/*** 雖然有synchronized具有如下特性:
* 偏向鎖(但是針對單執行緒訪問synchronized方法)
* 輕量鎖-第二個執行緒也能進入, 自旋,自旋還消耗cpu資源(相當於while true),還不如wait,wait不消耗cpu資源
* 所以如果synchronized放在方法中,對效能也不會很好
* * 分析出現執行緒不同步的場景:只有第一次載入的時候(多執行緒同時載入)才可能出現執行緒不同步的情況.
* 優化方式檢視singletonlazy3
*/public static synchronized singletonlazy2 getinstance() throws interruptedexception
return instance;
}}
雖然有synchronized具有如下特性:
偏向鎖(但是針對單執行緒訪問synchronized方法)
輕量鎖-第二個執行緒也能進入, 自旋,自旋還消耗cpu資源(相當於while true),還不如wait,wait不消耗cpu資源
所以如果synchronized放在方法中,對效能也不會很好
需要優化:
分析出現執行緒不同步的場景:只有第一次載入的時候(多執行緒同時載入判斷instance為null的之後,然後各自new instance)才可能出現執行緒不同步的情況.
優化方式檢視singletonlazy3
public class singletonlazy3
//禁止指令重排序
private static volatile singletonlazy3 instance;
/*** 分析出現執行緒不同步的場景:只有第一次載入的時候(多執行緒同時載入)才可能出現執行緒不同步的情況.
* * 從普通synchronized公升級到 singletonlazy2 在公升級到 雙重鎖,在公升級到 volatile
* * 雙重檢查(兩次判斷instance == null)再加鎖
*/public static singletonlazy3 getinstance ()
}} return instance;
}}
public class testsingleton
//1.測試飢漢模式
public static void testsinglehunger()
//2.測試懶漢模式
/*** 懶漢式1-1-執行緒安全問題
*/public static void testsinglelazy1()
});}
threadpool.shutdown();
}/**
* 懶漢式1-2-更明顯的執行緒安全問題
*/public static void testsinglelazy1_2()
});} threadpool.shutdown();
} public static void testsinglelazy2() throws exception catch (interruptedexception e)
}});
} threadpool.shutdown();
} public static void testsinglelazy3() throws exception
});} threadpool.shutdown();
}}
單例模式併發
在研究單例模式的時候,為了保證單例的懶載入是同步的,我們通常會選擇乙個duoble check的方法來保證只有第一次才new物件。1.雙重檢測同步延遲載入 如下 關於volatile的作用在這裡就是保證在new出物件的那一立馬寫入主存,同時通知其他執行緒的他們的cache是無效的,這樣instanc...
併發程式設計5
阻塞與非阻塞 阻塞 程式遇到io操作,導致 無法繼續執行,交出cpu執行權 非阻塞 沒有io操作或者遇到io操作也不阻塞 執行 寫程式時要儘量減少io操作 同步與非同步 同步 發起乙個任務後,必須原地等待任務執行結束,拿到乙個明確的結果 非同步 發起乙個任務後,不需要等待,繼續往下執行 非同步任務的...
單例模式 併發訪問
一 餓漢式 多執行緒併發,相對安全 class single private static final single s new single public static single getinstance 二 懶漢式 class single private static single s nu...