2016-01-22 180 views
1

我發現幾乎所有高級同步抽象(如Semaphore,CountDownLatch,來自java.util.concurrent的Exchanger)和併發集合都使用Unsafe(比如compareAndSwapInt方法)中的方法來定義臨界區。同時,我預計同步塊或方法將用於此目的。 你能解釋一下,不安全的方法(我的意思是隻能自動設置一個值的方法)比同步更有效率,它爲什麼如此?不安全的compareAndSwapInt與同步

回答

4

如果您希望等待很長時間(例如毫秒),使用synchronised可以更高效,因爲線程可以睡着並釋放CPU來完成其他工作。如果您期望操作很快發生,使用compareAndSwap會更有效。這是因爲它是一個簡單的機器代碼指令,只需要10 ns。但是,如果資源非常令人滿意,則此指令必須忙於等待,如果無法獲得所需的值,則可能會耗盡CPU,直到它耗盡爲止。

如果使用堆內存,則可以控制共享數據的佈局並避免錯誤共享(多個CPU正在更新相同的高速緩存行)。當你想要獨立更新多個值時,這很重要。例如爲環形緩衝區。

注意,內部實現的典型JVM的(例如,熱點)將經常使用的比較並交換硬件指令作爲部分​​實施如果這樣的指令是可用的(例如,。86),而另一種常見的替代方案是LL/SC(例如POWER,ARM)。一種典型的策略是使用比較和交換(或等效)的快速路徑來嘗試獲得鎖,如果該鎖是空閒的,則可能有短暫的spin-loop,最後如果該鎖失敗回退到OS級阻塞原語(例如,futex,Events)。細節遠遠超出了這個範圍,並且包括諸如biased locking之類的技術,並且最終取決於實現。

+0

你能詳細說一下最後一段嗎?小混亂[這裏](https://stackoverflow.com/q/47851595/3317808) – overexchange

+0

最後一段引用哪個JVM? – EJP

+1

我編輯了一下,以澄清在另一個線程混淆的背景下。我認爲關鍵在於Peter在最後一段提到硬件CAS指令(或類似指令),而不是任何導致混淆的Java語言級別的compareAndSwap方法或算法。 – BeeOnRope

相關問題