什么时候不使用Java中的volatile变量

最后发布: 2016-03-19 17:25:00


问题

我知道volatile变量仅保证可见性,而不应用于原子/化合物操作。 但是我想我读了一些地方,它也仅在一个线程正在更新值时(在一次操作中)才可以使用。 这个对吗 ?

因此,如果两个线程正在更新一个volatile变量,则说boolean标志是否安全?

java multithreading
回答

我了解volatile变量仅保证可见性和

正确

不应用于原子/化合物操作。

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

我想我读了一些仅在一个线程正在更新值时也可以使用的地方。 这个对吗 ?

那是一个解决方案。 如果您只有一位作者,则对该字段使用volatile

注意:常见的误解是, volatile对使用它的任何操作都赋予线程安全性。 例如

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标志(在单个操作中,例如将其设置为true或false),并且没有任何其他形式的同步,那么此线程安全吗?

仅当您有一位作家,或者他们都设置为相同的值时,这才是安全的。 例如

flag = true; // ok, provided no thread sets it to false.
flag = !flag; // not ok.