在学习Java 9时,我遇到了一种新的Thread类方法,叫做onSpinWait?.根据javadocs,这个方法用于此:
表示调用者暂时无法进展,直到其他活动发生一个或多个操作为止.
有人能帮助我理解这种方法给出一个真实的例子吗?
到目前为止,我对wait()和yield()方法的理解是,当线程没有执行任何任务并让CPU执行其他一些线程时,会调用yield().当一些线程被搁置并且通常用于同步的概念时,使用wait().但是,我无法理解其功能的差异,我不确定我所理解的是对还是错.有人可以解释它们之间的区别(除了它们存在的包装).
我正在学习 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 的修改?(发布/获取?易变?)