小编梁雨生*_*梁雨生的帖子

如何理解JDK9内存模型?

我正在学习 JDK9 内存模型。

在观看Java Memory Model Unlearning Experience演讲 并阅读 Using JDK 9 Memory Order Modes 一文后

我对一些概念感到困惑。

  1. 不透明是否立即保证可见性

  2. 如何理解论文中的偏序全序

对于第一个问题,论文说

使用等待变量值的空自旋几乎从来都不是一个好主意。使用 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 的修改?(发布/获取?易变?)

java multithreading volatile java-memory-model java-9

5
推荐指数
1
解决办法
267
查看次数

java8中使用volatile实现Acquire/Release模型

就我而言,我想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)

我的问题是:

  1. 代码同步是否正确?
  2. 有没有可能是 JIT 消除了未使用的局部变量,i从而导致acquire操作无效?

java jit volatile java-memory-model java-8

5
推荐指数
1
解决办法
121
查看次数

无法使用brew安装boost 1.59

酿造: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

macos homebrew boost

3
推荐指数
1
解决办法
3292
查看次数

jvm 内联最终方法吗?

当我阅读 java8 规范时,我得到了这样的声明

在运行时,机器代码生成器或优化器可以“内联”最终方法的主体,用其主体中的代码替换方法的调用。

https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.3.3

所以我的问题是热点真的内联了最终方法吗?

或者,是否只有最终方法可以内联?

java jvm hotspot

2
推荐指数
2
解决办法
150
查看次数