2013-01-22 19 views

回答

2

compareAndSet旨在由硬件實現,因此行爲將取決於您正在運行的特定硬件。來自java.util.concurrent.atomic:

此方法(根據參數類型在不同類中變化)自動將變量設置爲updateValue(如果它當前擁有expectedValue),成功時報告爲true。這個包中的類還包含獲取和無條件設置值的方法,以及下面描述的弱條件原子更新操作weakCompareAndSet。

這些方法的規範使得實現能夠採用在當代處理器上可用的高效的機器級原子指令。但是在某些平臺上,支持可能需要某種形式的內部鎖定。因此,這些方法並非嚴格保證是非阻塞的 - 在執行操作之前,線程可能會暫時阻塞。

假設典型的硬件,到達底層硬件指令的第一個線程將執行一個原子CAS(假設它具有正確的初始值)並且所有其他線程都會失敗。

如果底層硬件允許所有競爭線程發生故障,那麼在Java API中似乎沒有任何需要不同行爲的東西。然而,所有線程都可能失敗的CAS可能導致活鎖情況和非確定性行爲,因此任何實現CAS的硬件都可能保證一個線程將成功。

+0

如果CAS規範不支持硬件,那麼您如何從API規範中扣除所有線程都會失敗?我所能讀到的是,在這種情況下,實現可能使用軟件鎖,但觀察到的行爲必須保持一致。 – jarnbjo

+0

@Jim Garrison我理解並同意你所說的,除了「活鎖」之外。原子變量用於非阻塞算法/數據結構中,預計會偶爾發生故障,並且失敗的線程無論如何都可以重試。是的,如果所有在CAS上失敗的線程發生太頻繁,那麼「活鎖」可能是一種可能性。 – javapk

+1

查看我在答案中發佈的鏈接,您會看到CAS在硬件級別上可能實際上對所有線程都是失敗的,但JVM將硬件CAS封裝在一個循環中以確保[不可見](http: //cs.oswego.edu/pipermail/concurrency-interest/2013-January/010685.html)以獲得強大的CAS操作。 – assylias

1

也許值得一說的是你問的concurrency interest list的問題,並得到了以下answer

是的,它是保證AtomicX.compareAndSet。

真的,「強」和「弱」CAS有區別,第一個 不能虛假地失敗,第二個可以。 AtomicX.compareAndSet 是「強」CAS。 AtomicX.weakCompareAndSet是「弱」 CAS的示例,並且可以在沒有特定原因的情況下針對所有線程虛假地失敗。

相關問題