何时不在Java中使用volatile变量

Shi*_*nha 2 java multithreading

我理解volatile变量只保证可见性,不应该用于原子/复合操作.但是我想我读了一些只有在一个线程更新值时才能使用它(在单个操作中).它是否正确 ?

所以如果两个线程正在更新一个volatile变量,那么boolean flag是否可以安全?

Pet*_*rey 5

我理解volatile变量只能保证可见性和

正确

不应该用于原子/复合操作.

实际上所有的AtomicXxxx类都使用volatile.他们以安全的方式使用它,这是重要的区别.并非所有操作都是安全的.

我想我读过一些只有在一个线程更新值时才能使用的地方.它是否正确 ?

这是一个解决方案.如果您只有一个作者,那么使用volatile该字段就可以了.

注意:通常的误解是volatile为任何使用它的操作赋予线程安全性.例如

volatile int[] a = { 0 };

a[0]++; // not thread safe even if you have only 1 writer.
Run Code Online (Sandbox Code Playgroud)

这是因为写入a并且只是a易失性.任何a指向的东西也不是也volatile 没有什么不同final

final int[] a = { 0 };
a = null; // cannot do this
a[0] = 1; // compiles fine, is not final.
Run Code Online (Sandbox Code Playgroud)

我已经为你缩小了方案:如果两个线程正在更新一个volatile变量,请说boolean flag(在单个操作中,例如将其设置为true或false)并且没有任何其他形式的同步,n是否该线程安全?

只有你有一个作家,或者他们都设置为相同的值,这是唯一安全的.例如

flag = true; // ok, provided no thread sets it to false.
flag = !flag; // not ok.
Run Code Online (Sandbox Code Playgroud)

  • _"a"指向的任何东西是`volatile`_ - 不应该是"不是'挥发性'"吗? (3认同)