【发布时间】:2017-11-09 03:56:29
【问题描述】:
让非线程安全的可变对象X 在线程A 中构造。 A 传递 X,构建后,线程 B。 B 变异 X 和 A 不再访问 X。
X 的状态是否始终对B 可见?
X 是否有效地限制了线程?
我对 Java Concurrency in Practice 的阅读似乎表明 X 没有正确发布,但我不会在运行数百万次复制的测试台中对线程 B 造成任何问题。我怀疑这只是运气不好。
作为背景,X 代表了我无法控制的大量复杂类,这些类是由仅具有 Java 基本知识的建模者编写的。强烈建议X 没有同步块或其他并发机制或要求。
我目前正在通过让线程A 为X 传递B 调用的线程安全工厂来解决此问题,从而使X 线程受限。
【问题讨论】:
-
您能否详细说明
A如何将X传递给B? -
X 的集合被传递给实用程序类,该实用程序类将每个 X 的 Callable C 提交给完成服务。每个 X 都被传递到可调用的构造函数中。然后可调用对象在 X 上执行许多突变。
-
A CompletionService 包装了一个 ExecutorService ,因此似乎可以保证发生之前。谢谢。
-
我怀疑这只是运气不好。不一定。仅仅因为规范不保证某些行为,并不意味着您将无法始终如一地重现它。但理论上它可能会因对代码、编译器、运行时、操作系统、处理器等的任何细微更改而中断。
标签: java concurrency