監視器–JAVA同步基本概念
大學有一門課程叫操作係統,學習過的同學應該都記得,監視器是操作係統實現同步的重要基礎概念,同樣它也用在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()實現掛起線程,並且喚醒另外一個等待的線程,此外這些方法有三種不同版本:
1 |
wait( long timeout, int nanos)
|
2 |
wait( long timeout) notified by other threads or notified by timeout.
|
3 |
notify(all) |
這些方法隻能在一個同步塊或同步方法中被調用,原因是,如果一個方法不需要相互排斥,不需要監測或線程之間協作,每一個線程可以自由訪問此方法,那就不需要協作。
最後更新:2017-05-23 12:31:48
上一篇:
阿裏雲rds postgres回收用戶權限
下一篇:
Java IO: FileInputStream
成為阿裏雲大使的筆記
GNU通用公共授權(GNU General Public License)中英文版全文
阿裏雲上部署開源PaaS平台Cloud Foundry實戰
事務使用時MSDTC不可用解決辦法
???????????????Elasticsearch????????????2????????????2.4.3???????????????-??????-????????????-?????????
走進阿裏雲:做雲數據、大計算的No.1
3D打印技術在醫療領域能做些什麼?幫助精確完成手術
5月31日雲棲精選夜讀:揭密出席第九屆中國雲計算大會的專家—近20個國家學者共話雲計算大數據生態、應用
法院HP EVA8400刪除VDISK後數據恢複
雲服務器 ECS 使用OpenAPI管理ECS:使用OpenAPI彈性管理ECS實例