2010-10-17 12 views
5

假設我們有多處理器機器和多線程應用程序。如果兩個線程有​​權訪問同步方法,並且它們同時被執行,哪個線程將獲得鎖定? 還是會發生什麼?哪個線程會得到鎖?

由於

+0

我想,VM將不得不拋硬幣。 – 2010-10-17 10:18:32

+0

有點相關http://stackoverflow.com/questions/3940164/java-waiting-on-synchronized-block-who-goes-first – Thilo 2010-10-17 10:21:03

+0

這是否意味着如果兩個線程都嘗試獲取鎖在一個循環? – 2010-10-17 10:21:38

回答

2

問題是沒有「同時」這樣的東西。其中一人會得到鎖,但你無法知道哪一個。

「在同一時間」沒有這樣的事情,因爲,寬鬆地說,鎖是,它只是一次選擇和執行一個線程。

這自然是在可以一次執行一條指令的純粹單處理器系統中完成的。在多處理器系統上,通常會有一些硬件設備「鎖定」處理器,以防止它們同時執行。

+1

爲什麼不「同時」? – 2010-10-17 10:43:26

+0

爲什麼它不是「同時」的東西。我們正在討論一個多處理器硬件...... – aioobe 2010-10-17 11:00:25

+0

但是管理鎖的代碼必須以某種方式序列化。 – Thilo 2010-10-17 11:12:55

9

行爲將是非確定性(即,或者線程可能獲得鎖),並且它可以從執行到執行而變化。這是因爲它取決於具體的JVM實現以及線程的特定調度。

根據這篇文章JVM規範提出公平沒有任何限制:

公平
Java的內存模型不指定線程或搶佔式多線程任何公平性的要求。一個線程可以拒絕將CPU交給另一個線程並引發系統死鎖。公平性對其他線程的規則由各個JVM實現定義。

也就是說,除非您仔細同步您的程序,否則理論上一個線程可能會被調度程序餓死。

+2

我也不認爲在這個級別會有任何「同時」。一個線程會獲得鎖定,只是憑藉首先到達那裏。沒有必要擲硬幣。 – Thilo 2010-10-17 10:23:01

+0

是的,我同意... – aioobe 2010-10-17 10:32:04

相關問題