您好,登錄后才能下訂單哦!
這篇文章運用簡單易懂的例子給大家介紹深入淺析Java中監(jiān)視器的原理,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
1.什么是監(jiān)視器
監(jiān)視器可以看做是經(jīng)過特殊布置的建筑,這個建筑有一個特殊的房間,該房間通常包含一些數(shù)據(jù)和代碼,但是一次只能一個消費者(thread)使用此房間,
當一個消費者(線程)使用了這個房間,首先他必須到一個大廳(Entry Set)等待,調(diào)度程序?qū)⒒谀承藴?e.g. FIFO)將從大廳中選擇一個消費者(線程),進入特殊房間,如果這個線程因為某些原因被“掛起”,它將被調(diào)度程序安排到“等待房間”,并且一段時間之后會被重新分配到特殊房間,按照上面的線路,這個建筑物包含三個房間,分別是“特殊房間”、“大廳”以及“等待房間”。
簡單來說,監(jiān)視器用來監(jiān)視線程進入這個特別房間,他確保同一時間只能有一個線程可以訪問特殊房間中的數(shù)據(jù)和代碼。
2.JAVA中監(jiān)視器的實現(xiàn)
在JAVA虛擬機中,每個對象(Object和class)通過某種邏輯關(guān)聯(lián)監(jiān)視器,為了實現(xiàn)監(jiān)視器的互斥功能,每個對象(Object和class)都關(guān)聯(lián)著一個鎖(有時也叫“互斥量”),這個鎖在操作系統(tǒng)書籍中稱為“信號量”,互斥(“mutex “)是一個二進制的信號量。
如果一個線程擁有了某些數(shù)據(jù)的鎖,其他的線程則無法獲得鎖,直到這個線程釋放了這個鎖。在多線程中,如果任何時候都是我們自己來寫這個信號量,顯然不是很方便,幸運的是,JVM為我們自動實現(xiàn)了這些。
為了使數(shù)據(jù)不被多個線程訪問,java 提供了同步塊 以及 同步方法兩種實現(xiàn),一旦一段代碼被嵌入到一個synchronized關(guān)鍵字中,意味著放入了監(jiān)視區(qū)域,JVM在后臺會自動為這段代碼實現(xiàn)鎖的功能。
3.JAVA的同步代碼中,哪一部分是監(jiān)視器?
我們知道JAVA每個對象(Object/class) 都關(guān)聯(lián)一個監(jiān)視器,更好的說法應該是每個對象(Object/class)都有一個監(jiān)視器,對象可以有它自己的臨界區(qū),并且能夠監(jiān)視線程序列為了使線程協(xié)作,JAVA為提供了wait()和notifyAll以及notify()實現(xiàn)掛起線程,并且喚醒另外一個等待的線程,此外這些方法有三種不同版本:
wait(long timeout, int nanos)
wait(long timeout) notified by other threads or notified by timeout.
notify(all)
這些方法只能在一個同步塊或同步方法中被調(diào)用,原因是,如果一個方法不需要相互排斥,不需要監(jiān)測或線程之間協(xié)作,每一個線程可以自由訪問此方法,那就不需要協(xié)作。
關(guān)于深入淺析Java中監(jiān)視器的原理就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。