在线程之间传递对象
Passing objects between threads
我有生成对象并将它们推送到线程安全 Set
的工作线程。处理线程定期读取 Set
并处理元素。
虽然对象引用本身将从集合中成功检索,但如果从处理线程访问,对象的变量不是线程安全的。除了使所有对象的内部 volatile
等之外,是否有某种模式可以做到这一点?对象将来可能会变得更复杂,包含嵌套对象等
假设一旦放入 Set
就不会对任何对象进行外部修改,在我开始处理它之前,是否有某种方法可以 "happens-before" 当前在 Set
中的任何内容?处理线程已经运行并且不会仅在填充Set
之后创建。
对象本身只是数据容器,没有内在的线程安全性。我无法将所有字段设为最终字段,因为它们在放入 Set
.
之前可能会被修改多次
在这种情况下,Volatile 并不是灵丹妙药。查看为那些在线程之间传递的对象切换到不可变对象的可能性。此外,基于队列的线程安全数据结构将为您提供比大多数集合实现更好的性能。
如果您设置了线程安全,这将在写入之前建立,因此您不必担心对象是否线程安全。这假定您的生产者在将对象放入集合后不会更改或读取该对象。
如果你使对象不可变,这将使关系更清晰,但我假设一旦你将对象传递到共享存储,写线程不再改变对象,只有消费线程读取或改变对象。
顺便说一句,我会使用 ExecutorService 通过队列传递任务,因为它更高效并且是为您编写的。
我有生成对象并将它们推送到线程安全 Set
的工作线程。处理线程定期读取 Set
并处理元素。
虽然对象引用本身将从集合中成功检索,但如果从处理线程访问,对象的变量不是线程安全的。除了使所有对象的内部 volatile
等之外,是否有某种模式可以做到这一点?对象将来可能会变得更复杂,包含嵌套对象等
假设一旦放入 Set
就不会对任何对象进行外部修改,在我开始处理它之前,是否有某种方法可以 "happens-before" 当前在 Set
中的任何内容?处理线程已经运行并且不会仅在填充Set
之后创建。
对象本身只是数据容器,没有内在的线程安全性。我无法将所有字段设为最终字段,因为它们在放入 Set
.
在这种情况下,Volatile 并不是灵丹妙药。查看为那些在线程之间传递的对象切换到不可变对象的可能性。此外,基于队列的线程安全数据结构将为您提供比大多数集合实现更好的性能。
如果您设置了线程安全,这将在写入之前建立,因此您不必担心对象是否线程安全。这假定您的生产者在将对象放入集合后不会更改或读取该对象。
如果你使对象不可变,这将使关系更清晰,但我假设一旦你将对象传递到共享存储,写线程不再改变对象,只有消费线程读取或改变对象。
顺便说一句,我会使用 ExecutorService 通过队列传递任务,因为它更高效并且是为您编写的。