相关疑难解决方法(0)

Thread类的onSpinWait()方法

在学习Java 9时,我遇到了一种新的Thread类方法,叫做onSpinWait?.根据javadocs,这个方法用于此:

表示调用者暂时无法进展,直到其他活动发生一个或多个操作为止.

有人能帮助我理解这种方法给出一个真实的例子吗?

java concurrency multithreading spinlock java-threads

29
推荐指数
4
解决办法
4117
查看次数

wait()和yield()之间的区别

到目前为止,我对wait()和yield()方法的理解是,当线程没有执行任何任务并让CPU执行其他一些线程时,会调用yield().当一些线程被搁置并且通常用于同步的概念时,使用wait().但是,我无法理解其功能的差异,我不确定我所理解的是对还是错.有人可以解释它们之间的区别(除了它们存在的包装).

java multithreading

9
推荐指数
2
解决办法
1万
查看次数

如何理解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
查看次数