【问题标题】:Is volatile useful at all in a singlethreaded application in Java?volatile 在 Java 的单线程应用程序中是否有用?
【发布时间】:2016-02-04 11:32:44
【问题描述】:

如标题所示 - 在 Java 中的单线程编程上下文中是否存在 volatile 有用的情况?我知道它用于确保始终在内存中实际检查变量的值,所以在任何情况下,该值可能会以应用程序/编译器不会注意到的方式发生变化(在单线程应用程序中)?

【问题讨论】:

  • 无论如何我都想不到。
  • 我不确定this website 的真实性,但它非常清楚地列出了volatile 没有用的情况,而您的情况就是其中之一。

标签: java multithreading volatile single-threaded


【解决方案1】:

不,至少不是为您自己在单线程应用程序中定义的变量。

volatile 关键字保证与该变量的多次读取的发生前关系,这仅在多个线程访问它时才有意义。

其他见解here

【讨论】:

  • volatile 保证可见性和顺序,而不是原子性。
  • @AndyTurner, volatile 变量确保原子读写除了可见性之外...查看答案中的链接...
【解决方案2】:

从问题中描述的角度来看没有用,但会影响代码执行:

Happens-before 语义限制了程序指令的重新排序。通常如果你有

private int a;
private int b;
private boolean ready;

void calc(int x, int z) {
   a = x + 5;
   b = z - 3;
   ready = true;
}

允许 JIT 编译器以任何顺序执行方法指令(出于性能原因)。

但是如果你添加 volatile 关键字:private volatile boolean ready,那么它保证前两个操作会在true 被分配给ready 变量之前执行。这仍然没什么用,但从技术上讲是有区别的。

【讨论】:

  • Re 技术上存在差异,在底层可能存在差异,但如果在您的示例中添加 volatile 会使单线程的结果有所不同程序,则 Java/JVM 实现有缺陷。
  • @jameslarge 我没有这么说。示例显示 JIT 指令重新排序的差异。
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 2012-02-07
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多