Java 挥发性和原子性的区别
这很好,因为done被定义为volatile 除了done被定义为原子布尔值之外,相同的代码又如何呢?它是否达到了相同的效果?换句话说,原子(RMW)操作除了是原子的和可见的之外,是否也能保证以前的所有写操作都刷新到共享内存中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);
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);