【发布时间】:2021-04-29 23:19:44
【问题描述】:
我正在学习 JDK9 内存模型。
看完演讲 Java Memory Model Unlearning Experience 并阅读论文 Using JDK 9 Memory Order Modes.
我对一些概念感到困惑。
-
不透明是否立即保证可见性?
-
如何理解论文中的partial order和total order?
对于第一个问题,论文说
使用裸旋转等待变量值几乎从来都不是一个好主意。使用 Thread.onSpinWait、Thread.yield 和/或阻塞同步来更好地应对“最终”可能需要很长时间这一事实,尤其是当系统上的线程数多于内核数时。
所以如果我写代码:
// shared variable I and VarHandle I_HANDLE which referred to I
public static int I = 0;
public static final VarHandle I_HANDLE;
// Thread-1
I_HANDLE.setOpaque(1);
// Thread-2
while((int) I_HANDLE.getOpaque() == 0){
}
线程 2 最终会终止,但可能会在很长一段时间后终止?
如果是这样,是否有任何最小的方法来保证线程 2 立即看到线程 1 的修改? (发布/获取?易失性?)
【问题讨论】:
标签: java multithreading volatile java-9 java-memory-model