问题标签 [happens-before]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java 同步并发生在之前
同步语句建立了先发生关系。但我不确定细节。在http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html可以阅读
监视器的解锁(同步块或方法退出)发生在同一监视器的每个后续锁定(同步块或方法入口)之前
我想知道我是否理解正确。因此,请看以下示例。让我们假设有 2 个线程 T1、T2 共享类 Data 的相同实例数据和类 Object 的对象。现在以下代码按给定的线程和顺序执行:
因为 (1) 和 (2) 在同一个线程中执行,所以有 hb(1,2) 和模拟 hb(3,4)。在 (2) 中是监视器的解锁,在 (3) 中是同一监视器的锁定,因此 hb(2,3),因此 hb(1,4) 和 str 应该等于“newValue”。那是对的吗?如果不是 hb(2,3) 应该是错误的,但为什么呢?
编辑
因为需要数据类的详细信息来回答这个问题:
编辑2 很清楚,不能保证执行顺序。当一个人有
也不能保证 (1*) 在 (2*) 之前执行,但如果我是对的,则可以保证在 (2*) 之后,如果 (1*) 在 (2*) 之前执行,则 str= "newValue" *)。我想知道第一个例子是否同样适用
volatile - volatile 测试在 JLS 中没有满足其发生之前的特性
运行主程序
输出
在违规之前发生 p = 736;q = 827
在违规之前发生 p = 4635;q = 4657
在违规之前发生 p = 6421;q = 6440
在违规之前发生 p = 8719;q = 8803
java - Java 内存模型:易失性变量和发生前
我想澄清发生前的关系如何与volatile变量一起工作。让我们有以下变量:
和线程A:
和线程 B:
根据 Java 内存模型 (JMM),以下陈述是否正确?如果不是,正确的解释是什么?
i = 1
总是发生在之前v = 2
v = 2
在 JMM 中发生之前vDst = v
,仅当它实际上发生在时间之前i = 1
如果实际发生在时间之前iDst = i
,则在 JMM 中发生(并且iDst
将被可预测地分配)1
v = 2
vDst = v
- 否则 and 之间的顺序
i = 1
是iDst = i
未定义的,结果值 ofiDst
也是未定义的
逻辑错误:
JMM 中没有“挂钟时间”的概念,我们应该依赖同步顺序作为 和 的排序v = 2
指南vDst = v
。有关详细信息,请参阅所选答案。
java - .awaitTermination() 是否在执行程序中完成工作之前建立发生?
我多年来一直有的问题:在这个伪代码中,
.awaitTermination()
没有记录为在代码 A 和 B 之间 建立之前发生的事情。有没有理由不这样做?
ExecutorService和并发包javadocs 在任务和提交之前完成的工作之间定义了happens - before,而不是在成功调用之后的执行器任务和代码之间。.awaitTermination()
请注意,我并不是要求对如何重构我的代码以利用记录在案的发生前的关系进行设计批评。我的问题是,在这种情况下,文档没有提到发生之前是否有原因?
(请注意,这不是22665198的副本,尽管标题非常贴切。)
c++ - pthread_mutex_lock 是否有happens-before语义
threadA 浏览这个片段
threadB 浏览这个片段
并假设从观察者的角度来看,执行顺序确实是
- 线程A --- 1
- 线程A --- 2
- 线程B --- 3
- 线程B --- 4
threadB 的代码可以"int tmp = global_a;"
看到 threadA 的设置"global_a = 100;"
吗?
欢迎任何建议。
java - java.io.FileInputStream 仅从同步块内部访问私有易失性变量“关闭”。为什么?
据我所知,'happens-before' 表明在 synchronized 内部所做的更改对下一个线程可见,在同一个锁上同步。
不是多余的吗?
java - 先发生关系会影响优先级倒置吗?
我想知道诸如释放锁的volatile
变量或块之类的先发生关系是否与优先级反转有关?我知道这些强加了一种发生之前的关系,编译器无法重新排序指令。它是否也会影响优先级倒置,还是它们是独立的概念?有人可以给我一个例子来更好地理解这一点吗?finally
java - 执行器服务的并发数组访问
数组元素是否在工作人员之间正确发布?
假设我有一个大数组(任何原子数据类型,所以不是long
or double
),
- 我创建了一个工人来填充我传递给它的构造函数的数组,
- 我将工人提交给执行者,并等到它完成(例如with
future.get()
)。工人不返回任何东西。它只是填满了我的数组。 - 然后,我立即在其构造函数中创建并提交另一个具有相同数组的工作人员。它是否看到最新的值?
换句话说,它保证了前一个工作人员的最后一次写入发生在下一个工作人员的第一次读取之前?
我是否应该(或出于最佳实践或其他目的)让第一个工作人员返回数组,即使引用与我已经拥有的引用相同?
[编辑] 一些背景:我使用byte
数组或short
数组,它们代表图像并且每个使用多达 500,000,000 个元素。我对每个元素执行简单的算术运算。
c++ - C++:如果通过 boost lockfree 队列,一个线程能否将新分配的对象视为未初始化?
我正在构建一个多生产者单消费者机制。我想做这样的事情,假设我可以访问一个可用于两个线程的 boost lockfree 队列实例和一个同步条件变量:
线程 1(生产者):
线程 2(消费者):
在多核系统上,线程 2 是否有可能将 myObj 视为指向未初始化的内存或部分初始化的对象(假设它有一些成员变量)?
java - Happens-before 和 volatile 变量
以下只是 JMM 的三个“先发生”规则。我没有列出其他规则,因为我的问题仅与这三个规则有关。
- 监控锁定规则。监视器锁上的解锁发生在同一监视器锁上的每个后续锁之前。
- 线程开始规则。对线程的 Thread.start 调用发生在已启动线程中的每个操作之前。
- 中断规则。一个线程在另一个线程上调用中断发生在被中断的线程检测到中断之前(通过抛出 InterruptedException,或者调用 isInterrupted 或中断)。
问题
第一个规则问题- 假设两个线程 A 和 B 有同步的代码块。第一条规则是否意味着在线程 A 的同步块中设置的任何变量对线程 B 的同步块中的代码都是可见的,即使该变量未声明为易失性?
第二条规则问题- 假设线程 A 启动线程 B。第二条规则是否意味着在调用 start() 之前在父线程中设置的任何变量对线程 B 都是可见的,即使该变量未声明为 volatile ?
第三条规则问题- 假设线程 A 中断线程 B。第三条规则是否意味着线程 A 在中断线程 B 之前设置的任何变量在检测到中断后对线程 B 可见,即使该变量未声明为易挥发的?
最后,还有一个问题:
- 在 BlockingQueue 文档中,据说,
内存一致性效果:与其他并发集合一样,>线程中的操作在将对象放入 BlockingQueue 之前发生在操作>在>另一个线程中从 BlockingQueue 中访问或删除该元素之后。
这是否意味着在将对象从队列中出列后,线程 A 中设置的任何变量在将对象入队之前对线程 B 可见,即使该变量未声明为易失性?
基本上通过上述问题,我试图了解内存刷新是否发生在这些事件之后,以便在这些情况下不需要将变量声明为易失性。