gpt4 book ai didi

java - 在此类的对象上调用 start() 安全吗? Java 并发实践中的一个例子

转载 作者:行者123 更新时间:2023-12-01 20:01:15 27 4
gpt4 key购买 nike

首先,我将提供我将要讨论的源代码的链接,因为复制/粘贴会使这个问题页面太长。

在 list 5.15 http://jcip.net/listings/CellularAutomata.java 中在 JCIP 中,我想象在某些 main 方法中,人们将创建一个 CellularAutomata 对象,然后在该对象上调用 start() 。

但是,这样做可以吗?当调用该对象的 start 方法时,它将使用 Worker 实例创建 N(处理器数量)线程。似乎使用工作对象创建的 N 个线程可能会看到该工作人员的不完整引用或对象。

其背后的原因是,在调用时,this 引用在构建 CellularAutomata 对象的过程中逃逸new Runnable() 和 new Worker(mainBoard.getSubBoard(count, i))

自从 Worker[] worker 以来;和 CyclicBarrier 屏障;是 CellularAutomata 对象的字段,在该对象的 start() 方法中创建的线程可能无法看到处于正确状态的这些对象。

我认为这与持有人的示例类似http://jcip.net/listings/StuffIntoPublic.java http://jcip.net/listings/Holder.java其中 Holder 的字段可能对其他线程不可见。我知道 Holder 示例是有问题的,因为该字段不是最终的,因此可能不可见,而在元胞自动机中它们是最终的。我读到只有最终字段的类在发布时保证其字段的可见性。然而,我还读到,虽然最终字段可能是类的唯一字段,但如果类没有正确构造,那么这种保证就消失了。在这个例子中,由于 this 引用转义,我认为它没有正确构造。下面是一个隐式让 this 引用转义的示例,这与元胞自动机中发生的情况类似。 http://jcip.net/listings/ThisEscape.java

如果我的想法需要纠正,请告诉我,我将非常感激。这段并发之旅让我充满了很多疑虑和问题,如果您对我可以在哪里学习并发以及 Java 并发基础有任何其他引用,请告诉我。

谢谢

最佳答案

允许 this 逃逸的危险在于它可能在完全构造之前就被看到。在本例中,这不是问题,因为在调用 start() 之前,可运行对象不会执行,而调用必须在构造函数完成之后。

此外,除了 final 字段保证之外,在 mainBoard 的分配和执行之间至少还有两个额外的 happens-before 障碍可运行的。一是通过 the last thread entering the barrier 调用 Thread.start() ,其中happens-before any action in the started thread.然后是对 CylicBarrier.await() 的实际调用,其中happen[s]-before actions that are part of the barrier action .

所以我想说代码非常安全。

关于java - 在此类的对象上调用 start() 安全吗? Java 并发实践中的一个例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47988383/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com