在java中的incrementAndGet()实现中,将`getIntVolatile(Object var1,long var2)`替换为`getInt(Object var1,long var2)`
根据jdk,AtomicInteger类的方法incrementAndGet()的实现如下:在java中的incrementAndGet()实现中,将`getIntVolatile(Object var1,long var2)`替换为`getInt(Object var1,long var2)`,java,atomic,volatile,Java,Atomic,Volatile,根据jdk,AtomicInteger类的方法incrementAndGet()的实现如下: public final int incrementAndGet() { return unsafe.getAndAddInt(this, valueOffset, 1) + 1; } 如果getIntVolatile(objectvar1,longvar2)方法被getInt(objectvar1,longvar2)方法替换,会发生什么情况 我认为getIntVolatile(Object
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
如果getIntVolatile(objectvar1,longvar2)
方法被getInt(objectvar1,longvar2)
方法替换,会发生什么情况
我认为
getIntVolatile(Object var1,long var2)
方法是不必要的,因为被操作的变量是一个volatile变量,getInt(Object var1,long var2)
能够读取最新的值。看看incrementAndGet
的作用:
return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
unsafe
不知道valueOffset
中有一个volatile
字段,必须将其视为不安全。因此,这(我不是在使用var2
之类的,而是真正的源代码):
看起来确实可以防止一些可能的重新订购。假设您将该getIntVolatile
替换为getInt
:
do {
v = getInt(o, offset);
} while (!weakCompareAndSetInt(o, offset, v, v + delta));
由于这里没有易失性语义,编译器可以将读取内容移出循环:
int v = getInt(o, offset);
do {
} while (!weakCompareAndSetInt(o, offset, v, v + delta));
如果它这样做,您可能会陷入一个无限循环,非常简单。普通
getXXX
/putXXX
方法在不安全的类中,不要考虑volatile
关键字。它们总是执行普通加载/存储,没有内存可见性约束
do {
v = getInt(o, offset);
} while (!weakCompareAndSetInt(o, offset, v, v + delta));
int v = getInt(o, offset);
do {
} while (!weakCompareAndSetInt(o, offset, v, v + delta));