何时不在Java中使用volatile变量

时间:2016-03-19 17:25:00

标签: java multithreading

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

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

1 个答案:

答案 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.

这是因为对aa的写入是不稳定的。 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.