Java 執行緒間通訊 —— 等待 / 通知機制
阿新 • • 發佈:2021-02-21
> 本文部分摘自《Java 併發程式設計的藝術》
## volatile 和 synchronize 關鍵字 每個處於執行狀態的執行緒,如果僅僅是孤立地執行,那麼它產生的作用很小,如果多個執行緒能夠相互配合完成工作,則將帶來更大的價值 Java 支援多個執行緒同時訪問一個物件或者物件的成員變數,使用 volatile 關鍵字可以保證被修飾變數的可見性,意味著任一執行緒對該變數的任何修改,其他執行緒都可以立即感知到 synchronize 關鍵字可以修飾方法或者同步塊,它主要確保多個執行緒在同一時刻,只能有一個執行緒處於方法或者同步塊中,它保證了執行緒對變數訪問的可見性和排他性。synchronize 關鍵字的實現,本質是對一個物件的監視器(monitor)進行獲取,而這個獲取過程是排他的,也就是同一時刻只能有一個執行緒獲取到由 synchronize 所保護物件的監視器 任何一個物件都擁有自己的監視器,任意一個執行緒對 Object 的訪問(Object 由 synchronize 保護)的訪問,首先要獲得 Object 的監視器。如果獲取失敗,執行緒進入同步佇列,執行緒狀態變為 BLOCKED。當訪問 Object 的前驅(獲得了鎖的執行緒)釋放了鎖,則該釋放操作將喚醒阻塞在同步佇列中的執行緒,使其重新嘗試獲取監視器 ![](https://img2020.cnblogs.com/blog/1759254/202102/1759254-20210221162951491-514786442.png)