- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 chapter 17 of JLS ,它引入了一个概念:happens-before 一致。
A set of actions A is happens-before consistent if for all reads r in A, where W(r) is the write action seen by r, it is not the case that either hb(r, W(r)) or that there exists a write w in A such that w.v = r.v and hb(W(r), w) and hb(w, r)"
在我的理解中,它相当于以下几句话:...,情况是既不...也不...
所以我的前两个问题是:
它还给出了一个示例:17.4.5-1
Thread 1 Thread 2
B = 1; A = 2;
r2 = A; r1 = B;
按照第一次执行顺序:
1: B = 1;
3: A = 2;
2: r2 = A; // sees initial write of 0
4: r1 = B; // sees initial write of 0
命令本身已经告诉我们两个线程是交替执行的,所以我的第三个问题是:left number是什么意思?
根据我的理解,r2和r1都可以看到初始写入0的原因是A和B都不是 volatile 字段。所以我的第四个问题是:我的理解是否正确?
按照第二个执行顺序:
1: r2 = A; // sees write of A = 2
3: r1 = B; // sees write of B = 1
2: B = 1;
4: A = 2;
根据happens-before一致性的定义,不难理解这个执行顺序是happens-before一致的(如果我的第一理解是正确的话)。所以我的第五和第六个问题是:现实世界中是否存在这种情况(读看到稍后发生的写)?如果是的话,你能给我一个真实的例子吗?
最佳答案
每个线程都可以位于不同的核心上,并拥有自己的私有(private)寄存器,Java 可以使用这些寄存器来保存变量的值,除非您强制访问一致的共享内存。这意味着一个线程可以写入存储在寄存器中的值,并且该值在一段时间内对另一个线程不可见,例如循环或整个函数的持续时间。 (毫秒并不罕见)
一个更极端的例子是,读取线程的代码经过优化,假设由于它永远不会更改值,因此不需要从内存中读取它。在这种情况下,优化的代码永远看不到另一个线程执行的更改。
在这两种情况下,使用 volatile
可确保读取和写入以一致的顺序发生,并且两个线程看到相同的值。有时,这被描述为始终从主内存读取,但事实并非如此,因为缓存可以直接相互通信。 (因此对性能的影响比您预期的要小得多)。
在普通 CPU 上,缓存是“一致的”(不能保存陈旧/冲突的值)并且是透明的,不需手动管理。使数据在线程之间可见仅意味着在 asm 中执行实际的加载或存储指令来访问内存(通过数据缓存),并且可以选择等待存储缓冲区耗尽以给出排序。其他后续操作。
关于java - 如何理解happens-before一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61666124/
我们有一些第三方代码,它们执行以下操作 列表项 创建用户交易,例如 txn = (UserTransaction)ctx.lookup( "UserTransaction" ); txn.begi
表达式 "a".(strlen('ab')-strlen('a')) 按预期计算为 a1。 但是如果我不小心省略了括号, "a".strlen('ab')-strlen('a') 计算结果为-1。这里
我读到了有关 Java 类型删除的内容 on Oracle's website . 什么时候发生类型删除?在编译时还是运行时?类什么时候加载?类何时实例化? 很多网站(包括上面提到的官方教程)都说
我读到了有关 Java 类型删除的内容 on Oracle's website . 什么时候发生类型删除?在编译时还是运行时?类什么时候加载?类何时实例化? 很多网站(包括上面提到的官方教程)都说
我试图对 Haskell 中类型族“发生”的类型级计算何时(以及多少次)形成一种直觉。对于一个具体的例子,考虑这个类型类来索引到 n-ary product使用类型级自然: {-# LANGUAGE
我正在阅读 Java Concurrency in Practice书。 在阅读关于 JMM 的章节时,它说: The JMM defines a partial ordering called ha
我读到了 Java 的类型删除 on Oracle's website . 类型删除何时发生?在编译时还是运行时?什么时候加载类?什么时候实例化类? 很多网站(包括上面提到的官方教程)都说类型删除发生
我一周前通过互联网向 Apple 申请加入 Iphone 开发计划,并向他们发送了我的 99.00 美元。 我的印象是,总的来说,响应速度很快。然而,除了一封确认我购买的电子邮件之外,我什么也没看到。
我读到了 Java 的类型删除 on Oracle's website . 什么时候发生类型删除? 在编译时还是运行时?什么时候加载类?什么时候实例化类? 很多网站(包括上面提到的官方教程)都说类型删
我读到了 Java 的类型删除 on Oracle's website . 类型删除何时发生?在编译时还是运行时?什么时候加载类?什么时候实例化类? 很多网站(包括上面提到的官方教程)都说类型删除发生
有一个快速同步问题,这是我的: a) Class1 的并发 HashMap 定义如下: ConcurrentMap map = new ConcurrentHashMap(); b) Class2
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在研究 Java 并发性并找到了以下资源以供引用, http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-su
我根据Douglas Crockford在他的书“Javascript: the good parts”中提出的布局创建了一个对象构造函数。 此构造函数在添加各种成员和方法后返回一个 that 对象。
我正在编写一个单元测试(在 Mocha 中使用 Chai)来查看某个对象 o 是否是 instanceof ClassY。单元测试成功,但我可以让它失败,具体取决于我如何创建对象文字,尽管生成的对象文
假设我有一个包装 HashMap 的类,如下所示: public final class MyClass{ private final Map map; //Called by T
我想弄清楚 happens-before 属性的确切含义。 我看到 happens-before 属性的解释说,如果全局变量(不是易变的或包含在同步块(synchronized block)中)的更新
虽然在 SO 和其他地方有很多关于 happens-before 关系的帖子,但我很难找到我的问题的明确答案。 考虑两个 Java 线程: 最初,flag == false 和 data == 0 T
http://coliru.stacked-crooked.com/a/c795a5d2bb91ae32 #include struct X { X(const char *) { std:
我读到了 Java 的类型删除 on Oracle's website . 类型删除何时发生?在编译时还是运行时?什么时候加载类?什么时候实例化类? 很多网站(包括上面提到的官方教程)都说类型删除发生
我是一名优秀的程序员,十分优秀!