Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 挥发性和原子性的区别_Java_Multithreading_Volatile_Atomicity - Fatal编程技术网

Java 挥发性和原子性的区别

Java 挥发性和原子性的区别,java,multithreading,volatile,atomicity,Java,Multithreading,Volatile,Atomicity,这很好,因为done被定义为volatile 除了done被定义为原子布尔值之外,相同的代码又如何呢?它是否达到了相同的效果?换句话说,原子(RMW)操作除了是原子的和可见的之外,是否也能保证以前的所有写操作都刷新到共享内存中 int value = 0; volatile boolean done = false; // Thread A: value = 1; done = true; // Thread B: if (done) System.out.println(value);

这很好,因为done被定义为volatile

除了done被定义为原子布尔值之外,相同的代码又如何呢?它是否达到了相同的效果?换句话说,原子(RMW)操作除了是原子的和可见的之外,是否也能保证以前的所有写操作都刷新到共享内存中

int value = 0;
volatile boolean done = false;

// Thread A:
value = 1; done = true;

// Thread B:
if (done) System.out.println(value);
:

原子访问和更新的内存效应通常遵循挥发物的规则,如Java语言规范(17.4内存模型)所述:

  • get具有读取易失性变量的记忆效果
  • set具有写入(赋值)易失性变量的记忆效果
因此在这种情况下,
volatile
AtomicBoolean
之间没有区别:

原子访问和更新的内存效应通常遵循挥发物的规则,如Java语言规范(17.4内存模型)所述:

  • get具有读取易失性变量的记忆效果
  • set具有写入(赋值)易失性变量的记忆效果

因此,在本例中,
volatile
AtomicBoolean

之间没有区别。请参见AtomicBoolean构建在volatile字段之上。因此get是一个volatile读取,set是volatile写入。请看AtomicBoolean是构建在volatile字段之上的。因此get是一个易失性读取,set是一个易失性写入。
int value = 0;
AtomicBoolean done = new AtomicBoolean(false);

// Thread A:
value = 1; done.set(true);

// Thread B:
if (done.get()) System.out.println(value);