代码之家  ›  专栏  ›  技术社区  ›  Fredericson

如何避免在Java中使用volatile

  •  -4
  • Fredericson  · 技术社区  · 6 年前

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

    2 回复  |  直到 6 年前
        1
  •  0
  •   xingbin    6 年前

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

    不是这样的 volatile 工作 不稳定的 用于构建 happens-before 关系:

    这意味着对易失性变量的更改对 其他螺纹。此外,它还意味着当线程读取 volatile变量,它不仅可以看到volatile的最新变化, 还有导致这一变化的代码的副作用。

    doc .

    但现在我想去掉这个易失性标识符 实现这一目标?

    正如另一个答案中所说,您可以使用 AtomicBoolean 。或者,添加 synchronized 阻止代码读取/写入此变量。或者使用其他 mechanism ,以及他们可以构建 发生在之前 在不同线程中读写此变量之间的关系。

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

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

        2
  •  0
  •   light_303    6 年前

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