我正在学习JDK9内存模型。
看完演讲稿后,Java内存模型解题体验和使用JDK 9内存顺序模式看了报纸。
我对一些概念感到困惑。
关于第一个问题,论文说
使用裸旋转等待变量值几乎从来都不是一个好主意。使用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?(释放/获取?易挥发?)
发布于 2021-01-27 07:52:25
简单地说,不透明意味着读或写将会发生。所以编译器并没有对其进行优化。
它没有为其他变量提供任何排序保证。
因此,它是很好的,例如,性能计数器,其中一个线程做一个更新和其他线程读取它。
但是如果您要执行以下操作(伪)
// global
final IntReference a = new IntReference();
final IntReference b = new IntReference();
void thread1(){
a.setPlain(1);
b.setOpaque(1);
}
void thread2(){
int r1 = b.getOpaque();
int r2 = a.getPlain();
if(r1 == 1 && r2 == 0) println("violation");
}那就可能是“违规”被打印出来了,因为:
但是,如果要使用存储版本并加载获取,则不可能进行重新排序,因为发布和获取提供了与其他变量相关的排序约束。
void thread1(){
a.setPlain(1);
[StoreStore] <--
[LoadStore]
b.setRelease(1);
}
void thread2(){
int r1 = b.getAcquire();
[LoadLoad] <---
[LoadStore]
int r2 = a.getPlain();
if(r1 == 1 && r2 == 0) println("violation");
}https://stackoverflow.com/questions/65896858
复制相似问题