如何避免在Java中使用volatile

问题描述 投票:-4回答:2

我有两个线程共享boolean类型的相同变量。我发现我必须使用volatile来保证始终从主内存中读取值。但是现在我想摆脱这个易变的标识符,我怎么能实现呢?我可以轻松地将我的布尔属性提取到对象中,这是真的吗?由于对象的引用永远不会改变,因此线程将始终从主存储器访问正确的值。这会有用吗?

java volatile
2个回答
0
投票

我必须使用volatile来保证始终从主内存中读取值

这不是volatile的工作方式。 volatile用于建立一个happens-before关系船:

这意味着对volatile变量的更改始终对其他线程可见。更重要的是,它还意味着当线程读取volatile变量时,它不仅会看到volatile的最新更改,还会看到导致更改的代码的副作用。

- 来自doc

但是现在我想摆脱这个易变的标识符,我怎么能实现呢?

就像在另一个答案中所说,你可以使用AtomicBoolean。或者,在读取/写入此变量的代码周围添加synchronized块。或者使用其他一些mechanism,以及他们可以在不同的线程中读取和写入这个varibale之间建立一个happens-before关系。

我可以轻松地将我的布尔属性提取到对象中,这是真的吗?由于对象的引用永远不会改变,因此线程将始终从主存储器访问正确的值。这会有用吗?

不会。引用不会更改,这并不意味着新对象在更新后始终对其他读取线程可见。


0
投票

如果你不喜欢这个关键字,你也可以使用AtomicBoolean - 这也允许写访问也是线程安全的

© www.soinside.com 2019 - 2024. All rights reserved.