如果您上過大學的作業系統課程,您可能還記得監視器是作業系統中同步的重要概念。它也用於Java同步。這篇文章使用類比來解釋「監視器」的基本概念。
1.什麼是監視器?
監視器可以視為包含特殊房間的建築物。特殊房間一次只能容納一個客戶(線程)。房間通常包含一些數據和代碼。
如果客戶要佔用特殊房間,則必須先進入走廊(進入套裝)以等待。調度程序將根據某些條件(例如FIFO)選擇一個。如果由於某種原因他被停職,他將被送往候診室,並安排以後再進入特別室。如上圖所示,該建築物中有3個房間。
簡而言之,監視器是監視線程對特殊房間的訪問的設備。它確保只有一個線程可以訪問受保護的數據或代碼。
2.如何用Java實現?
在Java虛擬機中,每個對象和類在邏輯上都與監視器關聯。為了實現監視器的互斥功能,將一個鎖(有時稱為互斥鎖)與每個對象和類關聯。這在作業系統書籍中稱為信號量,互斥體是二進位信號量。
如果一個線程對某些數據擁有鎖,那麼只有擁有該線程的線程釋放該鎖,其他線程才能獲得該鎖。如果在進行多線程編程時始終需要編寫信號量,那將不方便。幸運的是,由於JVM自動為我們執行了此操作,因此我們不需要這樣做。
為了聲明一個監視區域,這意味著數據不能被多個線程訪問,Java提供了同步語句和同步方法。一旦代碼中嵌入了synced關鍵字,它就是一個監視區域。JVM自動在後臺實現鎖。
3.在Java同步代碼中,監視器是哪一部分?
我們知道每個對象/類都與一個Monitor關聯。我認為可以說每個對象都有一個監視器,因為每個對象可以有自己的關鍵部分,並且能夠監視線程序列。
為了啟用不同線程的協作,Java提供了wait()和notify()來掛起一個線程並喚醒另一個正在對象上等待的線程。此外,還有其他3個版本:
wait(longtimeout, int nanos)
wait(longtimeout) notified by other threads or notified by timeout. notify(all)
這些方法只能在同步語句或同步方法中調用。原因是,如果一個方法不需要相互排斥,則不需要監視線程之間或進行協作,則每個線程都可以自由訪問該方法。
最後,開發這麼多年我也總結了一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信發送領取資料或者在評論區留下自己的聯繫方式,有時間記得幫我點下轉發讓跟多的人看到哦。