Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中的incrementAndGet()实现中,将`getIntVolatile(Object var1,long var2)`替换为`getInt(Object var1,long var2)`_Java_Atomic_Volatile - Fatal编程技术网

在java中的incrementAndGet()实现中,将`getIntVolatile(Object var1,long var2)`替换为`getInt(Object var1,long var2)`

在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

根据jdk,AtomicInteger类的方法incrementAndGet()的实现如下:

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));