首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解JDK9内存模型?

如何理解JDK9内存模型?
EN

Stack Overflow用户
提问于 2021-01-26 06:36:01
回答 1查看 443关注 0票数 5

我正在学习JDK9内存模型。

看完演讲稿后,Java内存模型解题体验使用JDK 9内存顺序模式看了报纸。

我对一些概念感到困惑。

  1. 不透明是否立即保证可见性
  2. 本文如何理解偏序全序

关于第一个问题,论文说

使用裸旋转等待变量值几乎从来都不是一个好主意。使用Thread.onSpinWait、Thread.yield和/或阻塞同步来更好地处理“最终”可能会持续很长的时间这一事实,特别是当系统中线程多于核心时。

所以如果我写代码:

代码语言:javascript
复制
// 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?(释放/获取?易挥发?)

EN

回答 1

Stack Overflow用户

发布于 2021-01-27 07:52:25

简单地说,不透明意味着读或写将会发生。所以编译器并没有对其进行优化。

它没有为其他变量提供任何排序保证。

因此,它是很好的,例如,性能计数器,其中一个线程做一个更新和其他线程读取它。

但是如果您要执行以下操作(伪)

代码语言:javascript
复制
// 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");
}

那就可能是“违规”被打印出来了,因为:

  • a,b的商店被重新订购。
  • 来自a和b的货物被重新排序。

但是,如果要使用存储版本并加载获取,则不可能进行重新排序,因为发布和获取提供了与其他变量相关的排序约束。

代码语言:javascript
复制
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");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65896858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档