java 中非易失性变量的寄存器分配
Register allocation of non-volatile variables in java
我在 java 中有一个 reader 和作者线程,下面是代码片段。
int volatile ready = false;
int var1;
int var2;
int var3;
T1:
while(!ready);
print var1;
print var2;
print var3;
T2:
var1 = 1;
var2 = 2;
var3 = 3;
ready = true;
有没有可能var1,var2,var3分配在T2的一个寄存器中。
在 C++ 中,通过将 var1、var2 和 var3 标记为 volatile 来防止这种情况。
但是在Java中,这些变量是否也需要标记为volatile?
But in Java, do these variable need to be marked as volatile too?
如果您只关心它们的值是否对 T1 可见,不,它们不需要 volatile
。
由于 ready
是 volatile
,JSR 133 保证了 T2 的写入和 T1 的读取之间的先行关系。
详见常见问题解答:https://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile
我在 java 中有一个 reader 和作者线程,下面是代码片段。
int volatile ready = false;
int var1;
int var2;
int var3;
T1:
while(!ready);
print var1;
print var2;
print var3;
T2:
var1 = 1;
var2 = 2;
var3 = 3;
ready = true;
有没有可能var1,var2,var3分配在T2的一个寄存器中。 在 C++ 中,通过将 var1、var2 和 var3 标记为 volatile 来防止这种情况。 但是在Java中,这些变量是否也需要标记为volatile?
But in Java, do these variable need to be marked as volatile too?
如果您只关心它们的值是否对 T1 可见,不,它们不需要 volatile
。
由于 ready
是 volatile
,JSR 133 保证了 T2 的写入和 T1 的读取之间的先行关系。
详见常见问题解答:https://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile