4

在Java中的併發實踐中,作者寫道:是否有任何JVM實現用旋轉等待進行阻塞?

當鎖定競爭時,必須阻塞失敗的線程。在JVM可以實現經由旋等待(反覆嘗試,直到它成功獲取鎖)或通過懸浮通過操作系統被阻塞的線程阻塞效率更高取決於上下文切換開銷與直到鎖定可用的時間之間的關係;對於短等待來說,自旋等待是優選的,並且對於長期等待來說懸置是優選的。 一些JVM根據過去等待時間的分析數據自適應地選擇,但大多數只是掛起等待鎖定的線程。

當我讀到這個時,我很驚訝。是否有任何已知的JVM在執行旋轉等待或者由於性能分析結果有時需要旋轉等待時實現阻塞?現在很難相信。

+0

我不知道如何在JVM中使用,但是Windows在'CRITICAL_SECTION'對象的多核系統上實現自適應螺旋鎖。 – msandiford 2011-06-13 01:24:52

+0

是的,據我所知,正常的同步關鍵字使用自旋鎖來修改服務員。有impl可以旋轉幾秒鐘(只要你有足夠的內核,沒關係) – bestsss 2011-06-13 10:28:55

回答

2

作者寫的是正確的,它只是有意義的。對於Linux也是如此。爲什麼使用自旋鎖的原因是因爲大多數資源的保護時間僅爲幾分之一毫秒。因此,暫停時,將寄存器的所有內容壓入堆棧,放棄CPU只是太多開銷,不值得。因此,即使它只是在一系列嚴格的指令中旋轉,有時只是浪費時間,但仍然比交換更有效。

這就是說,使用VM分析,理想情況下,它會使您的處理更加高效。因此,是否有特定的情況下,你總是想暫停?或者也許總是在等待?

+0

我對Java並不熟悉,但出於好奇,程序員是否有可能強制掛起或強制自旋等待,而不是讓JVM自適應地選擇? – CMCDragonkai 2015-05-30 05:57:59