问题标签 [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.
scala - Akka 上下文监视/取消监视发生前的关系
我对两个演员(父母 P和孩子 C)有以下顺序操作:
- P看C (
context watch c
) - P不看C (
context unwatch c
) - P优雅地停止C (
c ! PoisonPill
)
我想知道的是;我能保证P 不会收到C的Terminated
事件吗?
这是一段示例代码
java - 在数组中建立 Happens-Before
有一个快速同步的问题,这是我的:
a) Class1有一个并发散列映射,定义如下:
b) Class2有一个线程,称为Thread1。Thread1 创建一个Id并检查map是否包含它。如果是,则检索值 (int[][]),修改内容并将其放回原处。如果没有,它会创建一个新的 int[][] 并存储它。这个检查->修改/创建的过程经常发生。
c) 最后,我有另一个线程,称为Thread2。这个线程接受一个 id,检查地图是否有它的值。如果没有,什么都不会发生。如果是这样,那么它将 int[][] 中的值相加,并使用该数字进行一些计算(此处没有修改)。
我想弄清楚我的操作是否是原子的。b) 中的操作很好,因为数组的创建/修改和插入映射仅限于一个线程(Thread1)。
此外,由于插入到映射中建立了先发生操作,这将确保 c) 将在 int[][] 中看到更新的值。
但是,我不太确定如果 Thread2 在映射中查找相同的 int[][] 并尝试在 Thread1 修改它时对其进行总结会发生什么。
我认为 Thread2 会在 int[][] 中看到旧的(但未损坏的)值是否正确。原因是在 Thread1 完成将值放回映射之前,新的修改不会对 Thread2 可见。
非常感谢。
java - 内存一致性——Java中的happens-before关系
在阅读有关内存一致性错误的 Java 文档时。我发现与创建发生的两个动作相关的点 - 在关系之前:
当一个语句调用
Thread.start()
时,与该语句具有发生前关系的每个语句也与新线程执行的每个语句具有发生前关系。导致创建新线程的代码的效果对新线程是可见的。当一个线程终止并导致
Thread.join()
另一个线程中的 a 返回时,终止线程执行的所有语句 与成功连接之后的
所有语句都具有发生前的关系。
线程中代码的效果现在对执行连接的线程可见。
我无法理解它们的含义。如果有人用一个简单的例子来解释它会很棒。
java - Java新内存模型中的happens-before是否也适用于声明为易失性的对象的成员?
在新的 Java 内存模型中,对变量的任何写入都保证在下一个线程读取它之前完成。
我想知道作为该对象成员的变量是否也是这种情况。
对于java内存模型:
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html
例如
和上面的代码一样,即使设置了functionMap
volatile,也不能保证函数对象在这个方法返回之前就已经完全构造好了。
我的想法对吗?
也只是为了这个话题,我想让你们检查一下我的想法是否适合以下内容:
像下面的任何写入functionMap
保证在更改引用之前完成functionMap
,对吧?无论initializeMap
方法需要多长时间,其他线程要么看到 null 要么看到functionMap
完全初始化的functionMap
?
上面澄清一下,上面两个例子都是在多线程环境下,functionMap变量会被多线程访问。
java - 使用双重检查锁定,对 volatile ConcurrentHashMap 的 put 是否具有先发生保证?
到目前为止,我使用了双重检查锁定,如下所示:
现在,因为我们有一组共享这个类的线程,所以我们将boolean
a更改ConcurrentHashMap
为如下:
我现在的问题是:如果我将标准声明Object
为volatile
,我只会在读取或写入其引用时建立起之前的关系。因此,在该对象中编写一个元素(如果它是一个标准HashMap
,则对其执行put()
操作)将不会建立这种关系。那是对的吗?(阅读一个元素怎么样;那不需要阅读参考资料并因此建立关系吗?)
现在,使用 volatile ConcurrentHashMap,将向其写入元素会建立起之前的关系,即上述方法仍然有效吗?
更新:这个问题的原因以及为什么双重检查锁定很重要:
我们实际设置的(而不是对象)是 a MultiThreadedHttpConnectionManager
,我们将一些设置传递给它,然后我们将其传递给HttpClient
我们设置的 a ,太,我们回来了。我们有多达 10 个组,每组最多 100 个线程,并且我们使用双重检查锁定,因为我们不想在每个需要获取组的时候阻塞它们HttpClient
,因为整个设置将用于帮助提高性能测试。由于笨拙的设计和奇怪的平台,我们不能只从外部传入对象,所以我们希望以某种方式使这个设置工作。(我意识到这个问题的原因有点具体,但我希望这个问题本身足够有趣:有没有办法得到那个ConcurrentHashMap
使用“易变行为”,即volatile boolean
在put()
对ConcurrentHashMap
? ;)
java - Java的happens-before和同步
我对 Java 的发生之前和同步有一点分歧。
想象以下场景:
主线程
其他主题
请注意, 的实例变量MyObject
既不是volatile
,也不是final
。的方法MyObject
不使用同步。
我的理解是:
1 发生在 3之前,因为在同一个监视器上存在同步,并且其他线程仅在2产生,它在1之后执行。
4上的操作不能保证稍后对主线程可见,除非所有线程都有进一步的同步,并且主线程在这些操作之后以某种方式同步。
问:是否可以保证0处的操作可见、发生之前、3上的并发访问,或者我必须将变量声明为volatile
?
现在考虑以下场景:
主线程
其他主题
我的理解是:
1 发生在 3之前,就像以前一样。
4上的操作在其他线程之间是可见的,
ReentrantLock
因为MyObject
.4上的操作在逻辑上发生在3之后,但是由于在不同的监视器上同步,从3到4没有发生之前的关系。
即使在 4 之后有同步,上述观点仍然
sharedMonitor
适用。unlock
4上的操作不会在5上的访问之前发生,即使主线程等待其他任务终止。这是由于5上的访问没有与 同步,所以主线程可能仍然看到过时的数据。
o.lock()
问:我的理解正确吗?
java - 线程永远等待通知情况
是否有可能在任何情况下在 ThreadA 中获得“永远等待”的情况。我的意思是通知执行速度比b.sync.wait();
java - “发生在”Java 与易失性字段相关的说明
我正在研究 Java Concurrency 并发现以下资源可供参考,
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html
http://docs.oracle.com/javase/tutorial/essential/concurrency/memconsist.html
我对有关 Happens-before 关系的声明有点困惑,
对 volatile 字段的写入发生在对同一字段的每次后续读取之前。volatile 字段的写入和读取具有与进入和退出监视器类似的内存一致性效果,但不需要互斥锁定。
我不清楚上述声明中的粗体声明。
有人可以给我一个想法,它与该声明相关的确切含义是什么?
java - 构造 nonFinalField 和内部 Runnable/Thread 可见性
我想这与发生之前的规则有关,但我没有具体的解释......我的问题是,是否保证线程“线程”可以看到 nonFinalField 对“Hello World”的引用?不,我不想让 nonFinalField 成为最终的,以后也不会更新,因为也没有允许它的方法。
希望我们可以用合理的解释来揭开这个例子的神秘面纱。
先感谢您。
亲切的问候,赫尔曼