亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java管程的概念和實現原理

發布時間:2021-06-18 16:11:39 來源:億速云 閱讀:715 作者:chen 欄目:編程語言

本篇內容主要講解“Java管程的概念和實現原理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java管程的概念和實現原理”吧!

管程的概念

在操作系統的概念里,monitor(管程)是為了解決使用信號量同步容易出錯的問題,而提出的一種高級同步原語。monitor是編程語言的組成部分,進入monitor時的互斥由編譯器來負責,寫monitor的人無需關心編譯器是如何實現互斥的,只需要將所有臨界區轉換成monitor即可。盡管管程提供了一種實現互斥的簡單方式,但是還不夠,還需要一種辦法使得進程/線程在無法繼續執行時被阻塞,解決的方法是引入條件變量以及兩個相關的操作:wait和signal。Java是真正支持管程的編程語言之一。

Java中的monitor支持兩種類型的線程同步: 互斥鎖同步和協作同步。在Java虛擬機中通過object locks支持的互斥鎖,允許多個線程獨立地工作在共享數據上,而不會互相干擾(在使用上即synchronized關鍵字,這里提到的是虛擬機層原理)。Java虛擬機通過Object類的 wait 和 notify 方法支持協作,使線程能夠朝著共同的目標協同工作。

互斥鎖同步

一個monitor就像一棟樓里面的一個特殊房間,在同一時間內只能被一個線程所占有,這個房間通常包含一些數據,從線程進入這個房間到離開這個房間,它可以訪問房間里的任何數據。

  • 進入這棟樓,稱為entering the monitor

  • 進入這個特殊房間,稱為acquiring the monitor

  • 占有這個特殊房間,稱為owning the monitor

  • 離開這個特殊房間,稱為releasing the monitor

  • 離開這棟樓,稱為exiting the monitor

除了與數據關聯之外,一個monitor還被關聯了很多的代碼,稱為monitor regionsmonitor regions包含一段原子的,不可分割的執行的代碼。

當線程到達monitor regions的開始位置時,它將被放置到所關聯monitor的一個 entry set中。 entry set類似于monitor大樓的前門廊。如果在entry set中沒有其他線程在等待,且當前沒有其他線程擁有monitor,則線程獲取monitor并繼續執行monitor regions內的代碼,執行完成后,它退出并釋放monitor。

如果一個線程到達monitor regions的開始位置時,該monitor已經被另一個線程所擁有,那么新到達的線程必須在 entry set中等待,只有當擁有者退出monitor后,新到達的線程必須與同樣在entry set中等待的其他線程競爭,只有一個線程可以勝出并獲得monitor。

以上講述的是互斥鎖同步。互斥鎖同步是指由多個線程互斥地執行monitor regions ,在任何時候,只有一個線程可以執行特定monitor的monitor regions。一般來說,只有當多個線程共享數據或其他資源時,互斥鎖才是重要的。如果兩個線程不使用任何公共數據或資源,它們通常不會互相干擾,也不需要以互斥的方式執行。

協作同步

當一個線程需要某些數據處于特定狀態,而另一個線程負責將數據轉換到該狀態時,協作非常重要。例如,一個“寫線程”負責填充的緩沖區,一個“讀線程”從緩沖區取走數據。如果讀線程發現緩沖區為空,則必須等待寫線程填充數據。如果寫線程發現緩沖區滿了,則必須等待讀線程取走數據。

Java 虛擬機使用的monitor的形式稱為"Wait and Notify" monitor,也可以稱為"Signal and Continue" monitor,在這種monitor形式中,當前擁有monitor的線程可以通過執行 wait 命令暫停(suspended)自己,它釋放monitor并進入一個wait set。線程將在wait set中保持暫停狀態,直到另一個線程在monitor內執行notify命令后。當一個線程執行一個 notify 時,它繼續擁有monitor,直到它通過執行一個wait命令,或者執行完成monitor regions內的代碼來釋放monitor。通知線程釋放monitor之后,等待線程將會復活(resurrected)并可以重新獲取monitor。

Java管程的概念和實現原理

圖中包含3個區域,中心區域包含一個活躍的線程(正在執行的),該線程擁有monitor,可以執行monitor regions內的代碼,稱之為monitor's owner,左邊是一個 entry set,右邊是一個wait set。圖中有5扇門,線程必須通過這些門與monitor交互。

當一個線程執行到monitor regions開始的地方時,它通過最左邊的1號門進入 entry set,如果當前沒有線程擁有monitor并且entry set中只有這一個線程,該線程會立即通過2號門成為monitor's owner,該線程可以繼續執行monitor regions內的代碼。如果當前有其他線程擁有monitor,該線程必須在entry set中等待,這個區域中可能有很多個其他的線程在等待。

圖中 entry set中有3個掛起的線程,wait set中有4個,只有當monitor's owner釋放了monitor后,這些線程才有機會得到執行。monitor's owner釋放monitor有2種方式:

  1. 執行完成區域內的代碼,通過5號門退出。

  2. 執行wait命令,進入wait set

如果monitor's owner在釋放monitor之前沒有執行notify命令,那么只有entry set中的線程會通過競爭來獲得monitor。如果執行了notify,那么entry set中的線程將不得不與wait set中線程競爭。如果一個線程從entry set中競爭獲勝,它通過2號門,成為monitor的新主人。如果wait set中的一個線程競爭獲勝,它通過4號門重新獲得monitor。注意,3號門和4號門是線程進入或退出wait set的唯一方式,線程只有在當前擁有monitor的情況下才能執行 wait 命令,而且它不能自動的離開wait set并再次成為monitor's owner

在Java虛擬機中,線程可以選擇在執行wait命令時指定一個timeout。如果一個線程指定了timeout,如果在timeout到期之前沒有其他線程執行通知,那么等待的線程會收到來自虛擬機的自動通知。timeout過期后,即使沒有其他線程執行顯式通知,等待線程也會恢復。Java虛擬機提供了兩種通知命令: “ notify”和“ notify all”。notify 命令可以從wait set中任意選擇一個線程,并將其標記為恢復。notify all命令標記當前處于wait set中的所有線程恢復。

Java中Object類聲明了5個方法(wait和notify),使程序員能夠使用Java虛擬機對同步協調方面的支持。這些方法被聲明為 public 和 final,因此它們被所有類繼承,只能從同步的方法或語句中調用它們。換句話說,在調用這些方法中的任何一個之前,必須已經獲取與對象關聯的鎖。

到此,相信大家對“Java管程的概念和實現原理”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

馆陶县| 辰溪县| 南溪县| 子长县| 津南区| 天水市| 英超| 楚雄市| 望奎县| 铁岭县| 大英县| 永泰县| 平利县| 牙克石市| 深圳市| 措勤县| 宜兴市| 宁蒗| 临猗县| 邵武市| 临湘市| 沅陵县| 武宣县| 东源县| 信阳市| 巨野县| 嵊州市| 西城区| 宾川县| 登封市| 安图县| 荔波县| 旺苍县| 虎林市| 会理县| 青冈县| 布拖县| 乌鲁木齐市| 淮南市| 马尔康县| 沙雅县|