Java併發程式設計序列之JUC中Condition執行緒通訊

我又不是架構師發表於2019-03-03

Java併發程式設計序列之JUC中Condition執行緒通訊

Hello,大家好,前面給大家講解synchronized關鍵字時給大家講了下執行緒間的通訊,wait和notify.這兩個API都是定義在Object中的方法,今天要給大家講的是JUC中的Condition介面來實現執行緒間通訊,該通訊方式比較靈活一點。文章結構:

  1. Condition通訊與wait,notify通訊的比較
  2. Condition API。
  3. Condition底層模型。

1. Condition通訊與wait,notify通訊的比較

Condition底層的執行緒等待也是使用的LockSupport的park方法。它對interrupt方法不敏感,而wait方法遇到interrupt就拋異常。
直接來張圖:

Java併發程式設計序列之JUC中Condition執行緒通訊

注意圖中響應中斷這一欄,其實原因上面已經說了。

2. Condition API

說下API,還是一張圖:

Java併發程式設計序列之JUC中Condition執行緒通訊

然後我用土話給大家說一說:await方法,其實就是先釋放鎖(說白了底層就是更改了AQS的state),然後呼叫LockSupport的park方法park自己,再把自己丟進Condition的等待佇列中。這裡不要忘記了,釋放鎖的同時還通知了同步佇列中的執行緒去拿鎖哦。

signal方法其實就是將Condition等待佇列中的執行緒移動到同步佇列。至於它拿不拿的到鎖,還是另外一回事。

3. Condition底層模型

Condition底層模型:

Java併發程式設計序列之JUC中Condition執行緒通訊

呼叫await()時:

Java併發程式設計序列之JUC中Condition執行緒通訊

呼叫signal()時:

Java併發程式設計序列之JUC中Condition執行緒通訊

結語

因為不是太難,所以只給大家看幾幅圖了。Over,Have a good day .

相關文章