Java併發程式設計序列之JUC中Condition執行緒通訊
Hello,大家好,前面給大家講解synchronized關鍵字時給大家講了下執行緒間的通訊,wait和notify.這兩個API都是定義在Object中的方法,今天要給大家講的是JUC中的Condition介面來實現執行緒間通訊,該通訊方式比較靈活一點。文章結構:
- Condition通訊與wait,notify通訊的比較
- Condition API。
- Condition底層模型。
1. Condition通訊與wait,notify通訊的比較
Condition底層的執行緒等待也是使用的LockSupport的park方法。它對interrupt方法不敏感,而wait方法遇到interrupt就拋異常。 直接來張圖:

2. Condition API
說下API,還是一張圖:

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

呼叫await()時:

呼叫signal()時:

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