需要同步布尔成员变量的设置吗?

fre*_*set 13 java multithreading

嘿所有,我正在研究我继承的一些代码,它看起来像一个线程正在设置一个布尔成员变量而另一个线程在一个while循环中检查它.这实际上是否可以正常工作,还是应该将其更改为在布尔变量上使用同步的getter或setter?

Rom*_*eau 7

在读取和写入bool或int这样的原语的情况下,将它们声明为volatile是很多的.当一个线程读取时,另一个线程将完成写入.变量永远不会处于无效状态.

可以公平地说,总的来说,Java中的volatile关键字记录很少,很难理解,很少使用.更糟糕的是,它的正式定义实际上从Java 5开始发生了变化.本质上,volatile用于表示变量的值将被不同的线程修改.

声明一个易变的Java变量意味着:

  1. 这个变量的值永远不会被线程本地缓存:所有读写都将直接进入"主存";
  2. 对变量的访问就像包含在同步块中一样,自身同步.

我们在第二点说"好像",因为至少对程序员来说(并且可能在大多数JVM实现中)没有涉及实际的锁对象.

http://www.javamex.com/tutorials/synchronization_volatile.shtml