我有工作线程生成对象并将它们推送到线程安全Set
。处理线程定期读取Set
并处理元素。
虽然将从集合中成功检索对象引用本身,但是如果从处理线程访问,则对象的变量不是线程安全的。是否有一些模式可以做到这一点,除了使所有对象的内部volatile
等?对象将来可能会变得更加复杂,包含嵌套对象等。
假设一旦置于Set
之外,没有任何对象会被外部修改,那么在我开始处理它之前,是否有某种方式“先发生”Set
中的任何内容?处理线程已在运行,只有在填充Set
后才会
对象本身只是数据容器,没有固有的线程安全性。我无法将所有字段设为最终字段,因为它们可能会被放置到Set
之前多次修改。
答案 0 :(得分:2)
如果你有一个线程安全设置,这将在写入之前建立,所以你不必担心该对象是否是线程安全的。这假定您的生产者在将对象放入集合后不会更改或读取该对象。
如果你使对象不可变,这将使关系更清晰,但是我假设一旦你将对象传递给共享存储,写入线程不会长时间改变对象,只有消费线程读取或改变对象
BTW我会使用ExecutorService通过队列传递任务,因为它更有效并且为您编写。
答案 1 :(得分:0)
在这种情况下,挥发性不是一个神奇的子弹。看看为线程之间传递的对象切换到不可变对象的可能性。此外,基于队列的线程安全数据结构将为您提供比大多数集合实现更好的性能。