我有两个线程共享boolean类型的相同变量。我发现我必须使用volatile来保证始终从主内存中读取值。但是现在我想摆脱这个易变的标识符,我怎么能实现呢?我可以轻松地将我的布尔属性提取到对象中,这是真的吗?由于对象的引用永远不会改变,因此线程将始终从主存储器访问正确的值。这会有用吗?
我必须使用volatile来保证始终从主内存中读取值
这不是volatile
的工作方式。 volatile
用于建立一个happens-before
关系船:
这意味着对volatile变量的更改始终对其他线程可见。更重要的是,它还意味着当线程读取volatile变量时,它不仅会看到volatile的最新更改,还会看到导致更改的代码的副作用。
- 来自doc。
但是现在我想摆脱这个易变的标识符,我怎么能实现呢?
就像在另一个答案中所说,你可以使用AtomicBoolean
。或者,在读取/写入此变量的代码周围添加synchronized
块。或者使用其他一些mechanism,以及他们可以在不同的线程中读取和写入这个varibale之间建立一个happens-before
关系。
我可以轻松地将我的布尔属性提取到对象中,这是真的吗?由于对象的引用永远不会改变,因此线程将始终从主存储器访问正确的值。这会有用吗?
不会。引用不会更改,这并不意味着新对象在更新后始终对其他读取线程可见。
如果你不喜欢这个关键字,你也可以使用AtomicBoolean - 这也允许写访问也是线程安全的