人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

破除java神話之線程按優先級喚醒

破除java神話之線程按優先級喚醒

更新時間:2022-07-27 文章作者:未知 信息來源:網絡 閱讀次數:

在編寫多線程代碼的時候經常發生多個線程等待一個事件的情況。這種情況多發生于多個線程在同步方法或者同步塊內調用wait方法等待同一個被鎖住的對象。當另一個鎖住該對象的線程從同步方法或者同步塊中調用notify或者notifyAll方法時這些等待線程被喚醒。notify調用僅僅喚醒一個線程,因此如果有多個線程正處于等待狀態,那么不會有對鎖的競爭。另一方面,notifyAll調用喚醒所有的等待線程而造成競爭,然而只有一個線程能夠得到鎖,其它的都會被阻塞。

  當多個線程處于等待狀態時的問題是當調用notify或者notifyAll方法后哪一個線程將運行?很多程序員不正確的假定存在一種預定義的順序表明線程如何被喚醒。一些認為是高優先級的線程首先被喚醒,另一些可能認為是等待了最長時間的線程首先被喚醒。不幸的是上面的假設都是不對的。在這些情況下,哪個線程被喚醒是不確定的,也許是最高優先級的線程,也許是等待最長的線程,但是沒有保證。

  線程的優先級不能決定它是否被喚醒(在使用notify方法的情況下)或者在多線程環境下的喚醒順序(在使用notifyAll方法的情況下)。因此,因此你永遠不應該假設線程的喚醒順序。另外,你也永遠不應該對搶占過程中的線程調度做任何假設。線程調度是實現相關的(implementation-dependent),不同的平臺的調度機制是不同的。如果你想你的程序具有可移植性就不應該做這樣的不明智的假設。

  另外,notifyAll和notify方法沒有提供喚醒等待進程的確定順序,具體的順序是依賴JVM的,并且notifyAll所能保證的事情不超過喚醒所有的等待線程。這個狀況使得當你想以某種特定的順序喚醒多個線程時會出現問題。

  有兩種辦法達到控制線程的喚醒順序:

  1、使用精確喚醒模式
  
  (Specific notification pattern)

  2、使用實現了實時規范的JVM(RTSJ,Real-Time Specification for Java)(譯者注:這其實不應該算一種好的方法,這加大了對特定JVM的依賴,打破了可移植性)

  精確喚醒模式由Tom Cargill開發,詳細說明了如何控制調用notify和notifyAll時的線程的喚醒順序。這個實現是通過對需要被一起喚醒的每個線程或者每一套線程設置一個單獨的鎖達到的。通過對特定的鎖進行釋放而達到可定義的通知順序。

  如果實現合適,那么這種模式的執行代價是最小的。然而不可避免的要增加編碼的復雜性,但是這個復雜性可以通過你得到的控制性抵消掉,如果你需要這樣的控制,你可以考慮實現這個模式。

  RTSJ改變了某些java語義的標準行為。其中之一就是確保等待線程按照優先級排序。因此當多個線程處于等待狀態而調用了notify或者notifyAll,那么具有最高優先級的那個將首先執行,其它的繼續等待。

  通常,這不是推薦的做法,除非是進行實時編程。已經有幾種不同的折衷方案使得java可以進行實時編程。創建RTSJ的最重要的一個原則就是及時性比執行速度更重要!

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 保德县| 盐城市| 织金县| 莆田市| 德安县| 周口市| 天全县| 吉木乃县| 汉沽区| 平谷区| 滦南县| 博客| 吉首市| 鄂托克前旗| 察哈| 叙永县| 克什克腾旗| 抚顺县| 涪陵区| 湟源县| 额敏县| 浮梁县| 芜湖县| 渝中区| 高安市| 盐源县| 高阳县| 噶尔县| 内丘县| 广宁县| 龙胜| 上林县| 富锦市| 溧阳市| 房产| 五寨县| 饶河县| 隆回县| 松阳县| 桂阳县| 芜湖县|