---------------------------------------------
上集回顧
上篇文章把基本的一些概念掃了下盲,本集我們在深入理解下。畢竟多線程不是看一篇文章就能搞懂的。大家還是多看幾遍,我也是看了很多專家們的資料才總結出來的。
本集目標
對synchronized深入理解
對wait()、sleep()、notify()、notifyAll()深入理解
圖文並茂
這圖搞清楚非常重要,上篇其實我也貼出來了,步驟描述我就不搬過來了,有興趣的大家看我另外一篇文章,傳送門打開
- notifyAll()把所有wait線程叫醒,這個通知肯定不會導致死鎖
- notify()只叫醒其中一個,容易導致死鎖
各種synchronized
紅色、藍色表示是相同效果,給大家列點偽代碼
情況1
synchronized(this){
//業務邏輯
}
情況2
public synchronized void func(){
//業務邏輯
}
情況3
synchronized(Test.class){
//業務邏輯
}
情況4
public static synchronized void fun(){
//業務邏輯
}
情況5
private String lock = new String ("lock");
synchronized(lock ){
//業務邏輯
}
情況6
private static String lock = new String ("lock");
synchronized(lock ){
//業務邏輯
}
- 情況1和情況2效果相同;
- 情況3和情況4效果相同;
- 情況6所有lock 對象都是同一把鎖,情況5每個lock對象一把;
synchronized【鎖】總結
- 方法裡 static synchronized 和 synchronized(類)都是鎖所有類,非 static synchronized 和 synchronized(this)都是鎖對象
- 記住鎖的不是代碼,而是對象【類就是所有對象】
- 【關鍵點】能不能同時執行,只要看鎖獲得的是哪個對象就行,其他需要這個鎖的方法都不能同時執行,不需要這個鎖的方法都能同時執行。
- 只有鎖同一個對象才行。
下集預告
synchronized其實還有個比較複雜的情況,就是抽象情況下父子的鎖又是個什麼情況,愛多線程真難,我總結了3篇多線程知識,先消化消化。
如果覺得對你有幫助請關注,有錯誤請指點,下集來幾篇【jdk8 lambda最佳應用舉例 】
閱讀更多 程序汪汪 的文章