Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免在Java中使用volatile_Java_Volatile - Fatal编程技术网

如何避免在Java中使用volatile

如何避免在Java中使用volatile,java,volatile,Java,Volatile,我有两个线程共享同一个布尔型变量。我发现我必须使用volatile来保证值总是从主存读取。但现在我想摆脱这个易失性标识符,我该如何实现呢?我可以轻松地将布尔属性提取到对象中,这是真的吗。由于对对象的引用从未更改,线程将始终从主内存访问正确的值。这样行吗 如果您不喜欢关键字,也可以使用AtomicBoolean-这也将允许写访问是线程安全的 我必须使用volatile来保证值总是从 主存 这不是volatile的工作方式volatile用于构建发生在关系之前的: 这意味着对易失性变量的更改对用户始

我有两个线程共享同一个布尔型变量。我发现我必须使用volatile来保证值总是从主存读取。但现在我想摆脱这个易失性标识符,我该如何实现呢?我可以轻松地将布尔属性提取到对象中,这是真的吗。由于对对象的引用从未更改,线程将始终从主内存访问正确的值。这样行吗

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

我必须使用volatile来保证值总是从 主存

这不是
volatile
的工作方式
volatile
用于构建发生在关系之前的

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

--从


但现在我想摆脱这个易失性标识符,我该怎么做呢 实现这一目标

正如在另一个答案中所说,您可以使用
AtomicBoolean
。或者,在读取/写入此变量的代码周围添加
synchronized
块。或者使用其他方法,也可以在不同线程中读取和写入此变量之间建立
之前发生的
关系

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


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

不,这将不起作用,如果不是易失性的,访问变量可能会被缓存。Volatile是获得一致性的最简单的方法。“但是现在我想通过查看原子布尔在幕后使用Volatile来摆脱这个Volatile标识符”=>为什么?你到底为什么要破坏工作代码?谁在为你浪费时间买单?基本上你问题中的所有陈述都是假的。