面试官问我,如果我们确定线程永远不会干扰,不使用 volatile
是否有任何危险。
例如。我们有:
int i = 10;
// Thread 1
i++;
// await some time and switch to Thread 2
getI();
我不使用任何同步。
我们是否有任何危险通过第二个线程接收 i
的过时值?
最佳答案
如果没有 volatile
或 synchronized
或读/写屏障,则无法保证另一个线程会看到您所做的更改,无论您等待多长时间。特别是 boolean
字段可以内联到代码中,实际上不执行读取。理论上,如果 JVM 检测到该字段未被线程更改,则可以内联 int
值(但我不相信它实际上会更改)
we know for sure that threads will never interfere.
这不是你能知道的,除非你执行更新时读取线程没有运行。当线程启动时,它会看到在它启动之前发生的任何更改。
关于java - jvm 是否保证在切换线程后更新处理器缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35365114/