簡體   English   中英

當幾個線程被鎖定時,它們以什么順序恢復運行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM