我正在学习 JDK9 内存模型。
在观看Java Memory Model Unlearning Experience演讲 并阅读 Using JDK 9 Memory Order Modes 一文后。
我对一些概念感到困惑。
不透明是否立即保证可见性?
如何理解论文中的偏序和全序?
对于第一个问题,论文说
使用等待变量值的空自旋几乎从来都不是一个好主意。使用 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){
}
Run Code Online (Sandbox Code Playgroud)
线程 2 最终终止,但可能会在很长时间后终止?
如果是这样,是否有任何最小方法可以保证线程 2 立即看到线程 1 的修改?(发布/获取?易变?)
就我而言,我想Acquire/Release在 java8 中使用volatile.
所以我写的代码使用了一个 volatile 共享变量I来保证MAP其他线程可以看到的修改。
public static volatile int I = 0;
public static final Map<String, String> MAP = new HashMap<>();
// run at Thread-1
public static void write(){
MAP.put("test", "test");
I++; // release
}
// run at Thead-2
public static void read(){
int i = I; // acquire
MAP.get("test"); // want to see the modifying by write()
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
i从而导致acquire操作无效?酿造:2.5.0
操作系统:macos 10.15.6
当我执行命令时brew install boost@1.59
发生错误Error: boost@1.59 has been disabled because it is a versioned formula!
我已经安装了boost那个版本是1.73.0
当我阅读 java8 规范时,我得到了这样的声明
在运行时,机器代码生成器或优化器可以“内联”最终方法的主体,用其主体中的代码替换方法的调用。
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.3.3
所以我的问题是热点真的内联了最终方法吗?
或者,是否只有最终方法可以内联?