java鎖:再來幾張圖深刻理解下synchronized「多線程愛你好難」

java鎖:再來幾張圖深刻理解下synchronized「多線程愛你好難」

多線程學起來

---------------------------------------------

上集回顧

上篇文章把基本的一些概念掃了下盲,本集我們在深入理解下。畢竟多線程不是看一篇文章就能搞懂的。大家還是多看幾遍,我也是看了很多專家們的資料才總結出來的。

本集目標

對synchronized深入理解

對wait()、sleep()、notify()、notifyAll()深入理解

圖文並茂

java鎖:再來幾張圖深刻理解下synchronized「多線程愛你好難」

多線程的狀態情況

這圖搞清楚非常重要,上篇其實我也貼出來了,步驟描述我就不搬過來了,有興趣的大家看我另外一篇文章,傳送門打開

java鎖:再來幾張圖深刻理解下synchronized「多線程愛你好難」

對比

  • notifyAll()把所有wait線程叫醒,這個通知肯定不會導致死鎖
  • notify()只叫醒其中一個,容易導致死鎖

各種synchronized

java鎖:再來幾張圖深刻理解下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最佳應用舉例 】


分享到:


相關文章: