2013-10-08 107 views
1

在某些情況下,線程將爭奪顯示器,此時一個線程應該贏,Java是否使用CPU中內置的原子CAS操作來實現這些顯示器的獲取,如果不是這樣工作的話?如何在Java中實現同步塊?

+3

這是一個VM實現細節。 –

+0

你不需要執行該操作 –

+0

它爲什麼重要?同步使用確保其目標所需的任何特定於平臺的方式來提供其併發性保證;在根本不支持併發的系統中,或者當Java可以證明該方法永遠不會被同時訪問時,它甚至可以被優化爲noop。他們究竟是如何實現的是你不需要擔心的實現細節,如果你的Java實現沒有提供這種保證,那麼它將不得不是一個錯誤或者(很少)與標準存在偏差。 –

回答

0

我不這麼認爲,因爲在concurrent包,你可以找到Atomic*類在內部使用CAS。

另一件事是它取決於你使用什麼樣的jvm。因此,在目前的形式中,除了告訴你CAS在其他地方被使用之外,你的問題不是真正的答案。

0

CAS是什麼讓所有併發工作在硬件級別。如果你想在所有線程中改變內存中的一個值,CAS是最快的方法;任何其他技術也將使用CAS。所以爲了快速改變,CAS是要走的路。但是如果你有100個甚至5個值要改變,你最好使用同步。它將執行一個CAS來鎖定顯示器,另一個解鎖它,但其餘的是正常的存儲器讀取和寫入,這比CAS快得多。當然,你的顯示器是鎖定的,這可能會掛起其他線程,減慢你的程序並可能浪費CPU。

更大的問題是,在Java中,任何CAS(或讀/寫易失性和同步/不同步)都伴隨着其他線程的內存視圖更新。當你寫一個volatile時,讀取它的線程可以看到通過編寫線程所做的所有內存更改。這包括將寄存器值轉儲到內存,刷新緩存,更新緩存以及將數據放回寄存器。但是這些費用與CAS相平行,所以如果你有了一個解決方案,你也有另一個解決方案。

的基本思想,我認爲,從程序員的角度來看,就是用易揮發或原子操作單讀取和寫入和同步multiples-- 如果沒有其他令人信服的理由,選擇了一個另一方面。