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()實現掛起執行緒,並且喚醒另外一個等待的執行緒,此外這些方法有三種不同版本:
wait(long timeout, int nanos)
wait(long timeout) notified by other threads or notified by timeout.
notify(all)
這些方法只能在一個同步塊或同步方法中被呼叫,原因是,如果一個方法不需要相互排斥,不需要監測或執行緒之間協作,每一個執行緒可以自由訪問此方法,那就不需要協作。
最後
想要學習java的同學私信回覆 資料
領取一線大廠題總結+阿里巴巴泰山手冊+各知識點學習思維導+一份300頁pdf文件的Java核心知識點總結!
這些資料的內容都是面試時面試官必問的知識點,篇章包括了很多知識點,其中包括了有基礎知識、Java集合、JVM、多執行緒併發、spring原理、微服務、Netty 與RPC 、Kafka、日記、設計模式、Java演算法、資料庫、Zookeeper、分散式快取、資料結構等等。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4550/viewspace-2826056/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用最簡單的例子講解js中解決非同步的方法JS非同步
- Java專案部署到雲伺服器最簡單的方法Java伺服器
- addEventListener 的一些好方法 簡單粗暴的說給你dev
- Java的簡單理解(2)Java
- 簡單理解同步與非同步非同步
- 簡單理解Java中的4種迴圈Java
- 簡單粗暴的去重promise的回撥Promise
- Java的物件監視器Java物件
- 簡單介紹java中的equals()方法Java
- java 最簡單的定時器,只需一行Java定時器
- js/ts prototype最簡單且深刻的理解JS
- 音視訊基本概念和FFmpeg的簡單入門
- 最簡單的 Git 伺服器Git伺服器
- 分享五款功能簡單粗暴的小軟體
- 簡單粗暴有效的mmap與remap_pfn_rangeREM
- 用最簡單的方式理解 IoC 控制反轉
- java介面和抽象類的簡單理解Java抽象
- Java的簡單理解(22)---處理流Java
- PDF轉文字檔案的最簡單方法
- 包含(處理)HTML的最簡單方法包括HTML
- 視訊下載終極利器!簡單粗暴,支援全網視訊下載!
- 如何最簡單、通俗地理解GPT的Transformer架構?GPTORM架構
- 關於Java註解(annotation)的簡單理解Java
- 關於MongoDB的簡單理解(二)--Java篇MongoDBJava
- 簡單聊聊Java中的ReentrantLockJavaReentrantLock
- ThreadLocal的簡單理解thread
- 九、 一個簡單的播放器(各自同步)播放器
- 最簡單的大白話給你說明白js的非同步機制JS非同步
- java方法練習之簡單計算器Java
- Android 最簡單的自定義檢視管理之一Android
- Flutter螢幕適配,簡單粗暴的全域性適配方式Flutter
- [Android]今日頭條的螢幕適配方案,簡單又粗暴!Android
- python中yield的用法詳解——最簡單,最清晰的解釋Python
- 簡單理解OpenTracing技術中的span概念
- 【譯】簡單理解 JavaScript 中的設計模式JavaScript設計模式
- 簡單快速理解js中的this、call和applyJSAPP
- 如何用python建立最簡單的伺服器Python伺服器
- C# 09修改介面引數_簡單粗暴C#