【发布时间】:2018-06-07 20:59:21
【问题描述】:
首先,我将提供指向我将要讨论的源代码的链接,因为复制/粘贴会使这个问题页面变得太长。
在 JCIP 的清单 5.15 http://jcip.net/listings/CellularAutomata.java 中,我想在某个 main 方法中,将创建一个 CellularAutomata 对象,然后对该对象调用 start()。
但是,这样做可以吗?当对象的 start 方法被调用时,它将创建 N(处理器数量)线程和 Worker 实例。似乎用 worker 对象创建的 N 个线程可能会看到该 Worker 的不完整引用或对象。
其背后的原因是,this 引用在调用时在 CellularAutomata 对象的构造过程中转义 new Runnable() 和 new Worker(mainBoard.getSubBoard(count, i))
而且由于 Worker[] 工人;和 CyclicBarrier 屏障;是 CellularAutomata 对象的字段,在该对象的 start() 方法中创建的线程可能无法看到这些处于正确状态的对象。
我认为这类似于持有人的示例http://jcip.net/listings/StuffIntoPublic.java http://jcip.net/listings/Holder.java 其他线程可能看不到持有人的字段。 我知道 Holder 示例存在问题,因为该字段不是最终的,因此可能不可见,并且在 CellularAutomata 中它们是最终的。我读到只有最终字段的类在发布时保证其字段的可见性。但是,我还读到虽然 final 字段可能是类的唯一字段,但如果该类没有正确构造,那么这种保证就没有了。在这个例子中,由于 this 引用转义,我认为它没有正确构造。这是一个隐式让 this 引用转义的示例,这与 CellularAutomata 中的情况类似。 http://jcip.net/listings/ThisEscape.java
如果我的想法需要纠正,请告诉我,我将不胜感激。这个并发之旅让我充满了很多疑问和问题,如果您有任何其他关于我可以在哪里学习并发以及 Java 中的并发基础的参考资料,请告诉我。
谢谢
【问题讨论】:
-
你可能可以和你的同学讨论:-) stackoverflow.com/questions/47986235/…
-
我的天哪 xD...问题是,那个人就是我,但我不知道那个帐户的密码...所以一旦我回到家,我就无法登录我的电脑.哈哈,我早就认出了你的名字:)
标签: java multithreading concurrency thread-safety safe-publication