Java多執行緒與併發 - 瞭解“monitor”
- 轉載來源:
- 監視器是作業系統實現同步的重要基礎概念,同樣它也用在JAVA的執行緒同步中,這篇文章用一種類推的思想解釋監視器”monitor”。
【1】什麼是監視器
- 監視器可以看做是經過特殊佈置的建築,這個建築有一個特殊的房間,該房間通常包含一些資料和程式碼,但是一次只能一個消費者(thread)使用此房間。
- 當一個消費者(執行緒)使用了這個房間,首先他必須到一個大廳(Entry Set)等待,排程程式將基於某些標準(e.g.FIFO)將從大廳中選擇一個消費者(執行緒),進入特殊房間,如果這個執行緒因為某些原因被“掛起”,它將被排程程式安排到“等待房間”,並且一段時間之後會被重新分配到特殊房間,按照上面的線路,這個建築物包含三個房間,分別是“特殊房間”、“大廳”以及“等待房間”。
- 簡單來說,監視器用來監視執行緒進入這個特別房間,他確保同一時間只能有一個執行緒可以訪問特殊房間中的資料和程式碼。
【2】JAVA中監視器的實現
- 在JAVA虛擬機器中,每個物件(Object和class)通過某種邏輯關聯監視器,為了實現監視器的互斥功能,每個物件(Object和class)都關聯著一個鎖(有時也叫“互斥量”),這個鎖在作業系統書籍中稱為“訊號量”,互斥(“mutex”)是一個二進位制的訊號量。
- 如果一個執行緒擁有了某些資料的鎖,其他的執行緒則無法獲得鎖,直到這個執行緒釋放了這個鎖。在多執行緒中,如果任何時候都是我們自己來寫這個訊號量,顯然不是很方便,幸運的是,JVM為我們自動實現了這些。
- 為了使資料不被多個執行緒訪問,java 提供了同步塊 以及同步方法兩種實現,一旦一段程式碼被嵌入到一個synchronized關鍵字中,意味著放入了監視區域,JVM在後臺會自動為這段程式碼實現鎖的功能。
【3】JAVA的同步程式碼中,哪一部分是監視器?
- 我們知道JAVA每個物件(Object/class)都關聯一個監視器,更好的說法應該是每個物件(Object/class)都有一個監視器,物件可以有它自己的臨界區,並且能夠監視執行緒序列為了使執行緒協作,JAVA為提供了wait()和notifyAll以及notify()實現掛起執行緒,並且喚醒另外一個等待的執行緒,此外這些方法有三種不同版本:
wait(long timeout, int nanos)
wait(long timeout) notified by other threads or notified by timeout.
notify(all)
-
這些方法只能在一個同步塊或同步方法中被呼叫,原因是,如果一個方法不需要相互排斥,不需要監測或執行緒之間協作,每一個執行緒可以自由訪問此方法,那就不需要協作。
-
在監視器(Monitor)內部,是如何做執行緒同步的?
- 監視器和鎖在Java虛擬機器中是一塊使用的。監視器監視一塊同步程式碼塊,確保一次只有一個執行緒執行同步程式碼塊。每一個監視器都和一個物件引用相關聯。執行緒在獲取鎖之前不允許執行同步程式碼
相關文章
- java多執行緒與併發 - 執行緒池詳解Java執行緒
- java多執行緒與併發 - 併發工具類Java執行緒
- JAVA多執行緒併發Java執行緒
- Java併發指南1:併發基礎與Java多執行緒Java執行緒
- Java多執行緒與併發之ThreadLocalJava執行緒thread
- Java高併發與多執行緒(一)-----概念Java執行緒
- java 多執行緒 併發 面試Java執行緒面試
- java多執行緒詳解(併發,並行,同步)Java執行緒並行
- java併發與執行緒Java執行緒
- Java多執行緒/併發06、執行緒鎖Lock與ReadWriteLockJava執行緒
- 【java 多執行緒】多執行緒併發同步問題及解決方法Java執行緒
- Java 併發和多執行緒(一) Java併發性和多執行緒介紹[轉]Java執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- 多執行緒與高併發(一)多執行緒入門執行緒
- Java多執行緒與併發基礎面試題Java執行緒面試題
- java多執行緒與併發 - Condition(條件)Java執行緒
- Java併發和多執行緒:序Java執行緒
- Java多執行緒/併發08、中斷執行緒 interrupt()Java執行緒
- 併發與多執行緒基礎執行緒
- 多執行緒與併發----Semaphere同步執行緒
- 10、Java併發性和多執行緒-執行緒安全與不可變性Java執行緒
- java基礎-多執行緒初步瞭解Java執行緒
- 【多執行緒與高併發】- 執行緒基礎與狀態執行緒
- Java多執行緒/併發12、多執行緒訪問static變數Java執行緒變數
- 多執行緒併發執行及解決方法執行緒
- JAVA多執行緒和併發基礎Java執行緒
- Java併發/多執行緒-CAS原理分析Java執行緒
- Java併發實戰一:執行緒與執行緒安全Java執行緒
- 多執行緒與併發----讀寫鎖執行緒
- Java併發和多執行緒1:併發框架基本示例Java執行緒框架
- java多執行緒與併發 - volatile的作用及原理Java執行緒
- Java多執行緒與併發程式設計總結(一)Java執行緒程式設計
- 深入理解Java多執行緒與併發框(第①篇)——執行緒的狀態Java執行緒
- 深入理解Java多執行緒與併發框(第⑪篇)——執行緒池引數Java執行緒
- Java高併發與多執行緒(三)-----執行緒的基本屬性和主要方法Java執行緒
- 【多執行緒與高併發】Java守護執行緒是什麼?什麼是Java的守護執行緒?執行緒Java