線程同步-監控器慨念

1. 什麼是監控器?

一個監控器就比如一個建築,裏面有一個特別的房間(building),這個特別的房間(special room)一次只能有一個客戶(或者說線程)進去,這個房間有一些資源(數據和代碼)。若是一個客戶想佔用這個特殊的房間,他必須先在門廳等候。安排人員可會按照一些方式給這些客戶排個序,好比先進先出安排客戶一個一個的進去。可能由於某些緣由一個客戶被中止進入特殊房間(也許他以前已經進入了這個特殊的房間),那麼他就須要在等候室(wait room)等候,以後再安排他進入特殊的房間。也就是說監控器的做用就是監控進程對特殊房間的訪問,它要保證一次只有一個進程能訪問這個特殊房間的數據和代碼。 java

2.java中怎樣實現監控器的概念

在java虛擬機中,每個對象和類都與一個監控器邏輯關聯。爲了實現監控器的互斥能力(一次只能有一個線程訪問),每個對象和類都關聯一把互斥鎖。若是一個線程獲取了某個資源的鎖,那麼其餘的線程就都不能得到這個資源的鎖了,直到當前線程釋放了這個資源的鎖其餘線程才能獲取這個資源的鎖並訪問這個資源。鎖的釋放和獲取將由java虛擬機自動完成,因此咱們不用關心太多。
java用synchronized關鍵字來申明監控區,監控區中的代碼和數據受監控器監控以保證一次只能有一個線程能訪問監控區的資源。 ui

3. 在同步代碼塊中如何找到監控器

每一個對象和類都與一個監控器相關聯,也就是說每一個對象都有一個監控器,而且有本身的臨界監控區,這也意味着每一個對象都有能力監控線程序列。當線程執行synchronized 聲明的方法或代碼塊的時候就進入了監控區。
爲了使不一樣的線程能相互合做,java提供了wait()和notify()來暫停一個線程的執行,以喚醒另外一個等待在這個對象上的線程。
然而這些方法只有在synchronized 聲明的代碼塊和方法中使用纔有意義,由於若是一個方法並不須要互斥操做,那麼就沒有必要爲這個方法設置監控區以致於一次只能有一個線程能訪問。這樣也就不存在等待和喚醒的概念。 spa


參考文章:http://www.programcreek.com/2011/12/monitors-java-synchronization-mechanism/ 線程

相關文章
相關標籤/搜索