volatile 在 Java 的单线程应用程序中是否有用?
Is volatile useful at all in a singlethreaded application in Java?
如标题所示 - 在 Java 的 single-thread 编程环境中,volatile 是否有用?我知道它用于确保变量的值始终在内存中实际检查,所以在任何情况下该值可能会以 app/compiler 不会注意到的方式更改(在单线程应用程序中)?
不,至少对于您自己在单线程应用程序中定义的变量不是。
volatile
关键字保证了多次读取该变量的先行关系,这仅在多个线程访问它时才有意义。
其他见解here。
从问题描述的角度看没有什么用,但是会影响代码执行:
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
变量之前执行。这仍然很没用,但从技术上讲是有区别的。
如标题所示 - 在 Java 的 single-thread 编程环境中,volatile 是否有用?我知道它用于确保变量的值始终在内存中实际检查,所以在任何情况下该值可能会以 app/compiler 不会注意到的方式更改(在单线程应用程序中)?
不,至少对于您自己在单线程应用程序中定义的变量不是。
volatile
关键字保证了多次读取该变量的先行关系,这仅在多个线程访问它时才有意义。
其他见解here。
从问题描述的角度看没有什么用,但是会影响代码执行:
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
变量之前执行。这仍然很没用,但从技术上讲是有区别的。