![](/img/trans.png)
[英]is it guaranteed that threads will resume in the order they were suspended/blocked by wait() in Java?
[英]When several threads are blocked on a lock, in what order do they resume running?
線程A,B,C以此順序到達單個對象中的同步方法f() 。
所有優先級都相同。
B和C被阻止。
葉f() 。
現在哪個線程開始在f()中運行? 在FIFO原則上是否總是B? 還是順序不確定?
如果C的優先級高於B,那是否保證C的運行優先於B?
對於所有應用程序意圖和目的,您都可以假定順序是完全隨機的 。 不要和優先次序方面起到-你可以很容易地引入微妙的優先級反轉缺陷非常非常 非常難抓。
就我所知,這是不確定的。
也好 如果您要編寫依賴於優先級來確定執行順序的編碼,那就錯了。 您要么明確而有意地控制這些東西,要么為發生的一切做好准備。 最好是編寫無論如何都會起作用的代碼。
優先級是對運行時調度程序的提示 ,而不是硬性規定。 完全忽略優先級或以與優先級無關的順序調度線程是可能且合法的。 最好的希望是,平均而言,在IO等待允許的其他情況下,高優先級線程比低優先級線程獲得更多的CPU時間。
順序是不確定的。 具有較高的優先級並不能保證先恢復。 較高的優先級意味着線程在運行時會獲得更多的CPU時間,但是不需要實現就可以先將其賦予鎖。
順便說一句,無法編寫確定性代碼來保證您描述的ABC鎖定條目順序。 使用Java方法無法完成。 如果你寫的代碼,你認為產生有序可靠,你沒有測試它不夠。 由於您不知道線程將以什么順序進入鎖,因此即使有FIFO策略,您也無法知道線程離開鎖的順序。
與線程一樣-您永遠不會知道。
這取決於操作系統的調度程序使用哪種算法。 查看此以獲得有關調度程序行為的更多信息。
但是,您始終可以做一些技巧來模擬欲望順序。
當系統中的所有可運行線程具有相同的優先級時,調度程序將選擇下一個線程以簡單的,非搶先的循環調度順序運行。
這也取決於操作系統和CPU數量。 如果有多個CPU,並且OS支持相同的線程,則可以執行多個線程。
有趣的舊鏈接:
http://journals.ecs.soton.ac.uk/java/tutorial/java/threads/priority.html
它是未指定的/依賴平台的。 但是,Java 信號量可能很公平 -是什么保證了FIFO。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.