我无法理解在无限 for 循环中编写操作序列的目的。
这段代码的目的是确保volatile
字段得到适当的更新,而没有synchronized
锁的开销。除非有大量线程都在竞争更新同一个字段,否则这很可能会旋转几次才能完成。
volatile
关键字提供可见性和内存同步保证,但本身并不能确保具有多个操作(测试和设置)的原子操作。如果您正在测试然后设置一个volatile
字段,那么如果多个线程试图同时执行相同的操作,则会出现竞争条件。在这种情况下,如果多个线程试图同时增加AtomicInteger
,您可能会错过其中一个增量。此处的并发代码使用自旋循环和compareAndSet
底层方法来确保volatile int
仅在仍等于 3 时才更新为 4(例如)。
- t1 得到 atomic-int 并且它是 0。
- t2 得到 atomic-int 并且它是 0。
- t1 加 1
- t1原子地测试以确保它是 0,它是,并存储 1。
- t2 加 1
- t2原子地测试以确保它是 0,它不是,所以它必须旋转并重试。
- t2 得到 atomic-int 并且它是 1。
- t2 加 1
- t2原子地测试以确保它是 1,它是,并存储 2。
它在 Java 内存模型 (JMM) 中是否有任何特殊用途。
不,它服务于类和方法定义的目的,并使用JMM 和周围的语言定义volatile
来实现其目的。JMM 定义了语言对synchronized
、volatile
和其他关键字的作用以及多个线程如何与缓存和中央内存交互。这主要是关于本机代码与操作系统和硬件的交互,很少(如果有的话)关于 Java 代码。
它是通过调用主要是带有一些包装器的本机方法compareAndSet(...)
的类来更接近 JMM 的方法:Unsafe
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}