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

由于 readyvolatileJSR 133 保证了 T2 的写入和 T1 的读取之间的先行关系。

详见常见问题解答:https://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile