在Java中,AtomicInteger
和AtomicLong
似乎实现了与.NET Interlocked
相同的功能。此外,它们提供get()
方法来读取最新值(可能与存储在CPU缓存中的值不同):
private volatile int value;
// ...
/**
* Gets the current value.
*
* @return the current value
*/
public final int get() {
return value;
}
另一方面,Interlocked
仅为64位值提供Read(...)
方法,这只保证它们一致(即在32位系统上)你不读任何垃圾),但读取的值不是最新的。
现在的问题。如果我将volatile
变量与Interlocked
结合使用,是否可以保证该值可以递增/递减和读取/写入原子 ?