是否保证compareAndSwap不会因所有参与线程而失败?

jav*_*apk 7 java concurrency compare-and-swap

假设一些"N"个线程正在尝试CAS一个AtomicInteger变量,是否保证CAS必须成功完成一个线程?

是否有可能所有"N"线程都尝试失败?

Jim*_*son 4

compareAndSet旨在由硬件实现,因此行为将取决于您正在运行的特定硬件。来自 java.util.concurrent.atomic:

此方法(不同类的参数类型不同)会自动将一个变量设置为 updateValue(如果它当前持有预期值),并在成功时报告 true。此包中的类还包含获取和无条件设置值的方法,以及下面描述的较弱的条件原子更新操作weakCompareAndSet。

这些方法的规范使实现能够采用当代处理器上可用的高效机器级原子指令。然而,在某些平台上,支持可能需要某种形式的内部锁定。因此,不能严格保证这些方法是非阻塞的——线程在执行操作之前可能会暂时阻塞。

假设典型的硬件,第一个到达底层硬件指令的线程将执行原子 CAS(假设它具有正确的初始值),所有其他线程将失败。

如果底层硬件允许所有竞争线程失败,那么 Java API 中似乎没有任何内容需要不同的行为。然而,如果 CAS 可能对所有线程都失败,则可能会导致活锁情况和不确定性行为,因此任何实现 CAS 的硬件都可能保证一个线程会成功。