如何避免在Java中使用volatile
我有两个线程共享同一个布尔型变量。我发现我必须使用volatile来保证值总是从主存读取。但现在我想摆脱这个易失性标识符,我该如何实现呢?我可以轻松地将布尔属性提取到对象中,这是真的吗。由于对对象的引用从未更改,线程将始终从主内存访问正确的值。这样行吗 如果您不喜欢关键字,也可以使用AtomicBoolean-这也将允许写访问是线程安全的 我必须使用volatile来保证值总是从 主存 这不是如何避免在Java中使用volatile,java,volatile,Java,Volatile,我有两个线程共享同一个布尔型变量。我发现我必须使用volatile来保证值总是从主存读取。但现在我想摆脱这个易失性标识符,我该如何实现呢?我可以轻松地将布尔属性提取到对象中,这是真的吗。由于对对象的引用从未更改,线程将始终从主内存访问正确的值。这样行吗 如果您不喜欢关键字,也可以使用AtomicBoolean-这也将允许写访问是线程安全的 我必须使用volatile来保证值总是从 主存 这不是volatile的工作方式volatile用于构建发生在关系之前的: 这意味着对易失性变量的更改对用户始
volatile
的工作方式volatile
用于构建发生在关系之前的:
这意味着对易失性变量的更改对用户始终可见
其他线程。更重要的是,它还意味着当线程读取
volatile变量,它不仅看到volatile的最新变化,
还有导致这一变化的代码的副作用
--从
但现在我想摆脱这个易失性标识符,我该怎么做呢
实现这一目标
正如在另一个答案中所说,您可以使用AtomicBoolean
。或者,在读取/写入此变量的代码周围添加synchronized
块。或者使用其他方法,也可以在不同线程中读取和写入此变量之间建立之前发生的关系
我可以轻松地将布尔属性提取到
对象由于对对象的引用永远不会更改,因此线程将始终
从主存储器中访问正确的值。这样行吗
否。引用不会更改,这并不意味着更新后的新对象对其他读取线程始终可见 不,这将不起作用,如果不是易失性的,访问变量可能会被缓存。Volatile是获得一致性的最简单的方法。“但是现在我想通过查看原子布尔在幕后使用Volatile来摆脱这个Volatile标识符”=>为什么?你到底为什么要破坏工作代码?谁在为你浪费时间买单?基本上你问题中的所有陈述都是假的。