我理解volatile变量只保证可见性,不应该用于原子/复合操作。但是我想我读了一些只有在一个线程更新值时才能使用它(在单个操作中)。它是否正确 ?
所以如果两个线程正在更新一个volatile变量,那么boolean flag是否可以安全?
答案 0 :(得分:5)
我理解volatile变量只保证可见性和
正确
不应用于原子/复合操作。
实际上所有的AtomicXxxx类都使用volatile。他们以安全的方式使用它,这是重要的区别。并非所有操作都是安全的。
我想我读过一些只有在一个线程更新值时才能使用的地方。这是对的吗?
这是一个解决方案。如果您只有一位作家,那么使用volatile
对该字段来说就可以了。
注意:volatile
为使用它的任何操作赋予线程安全性是一种常见的误解。 e.g。
volatile int[] a = { 0 };
a[0]++; // not thread safe even if you have only 1 writer.
这是因为对a
和a
的写入是不稳定的。 a
指向的任何内容都不是volatile
这与final
final int[] a = { 0 };
a = null; // cannot do this
a[0] = 1; // compiles fine, is not final.
我已经为你缩小了方案:如果两个线程正在更新一个volatile变量,请说boolean flag(在单个操作中,例如将其设置为true或false)并且没有任何其他形式的同步,n是否该线程安全?
如果您有一个作家,或者他们都设置为相同的值,这是唯一安全的。例如
flag = true; // ok, provided no thread sets it to false.
flag = !flag; // not ok.