使用阻塞队列时是否需要额外的同步?

2022-09-03 00:04:52

我有一个简单的bean @Entity Message.java它具有一些正常属性。该对象的生命周期如下所示

消息的实例化发生在线程 A 上,然后将其排队成阻塞队列

来自池的另一个线程获取该对象并对其执行一些操作并更改 Message 的状态,之后,该对象再次进入阻塞队列。重复此步骤,直到条件使其停止。每次对象被读/写都可能来自不同的线程,但要保证一次只有一个线程可以读/写它。

在这种情况下,我是否需要同步 getters/setters?也许使属性不稳定?或者我可以不同步就离开吗?

谢谢,希望我能澄清我在这里有什么。


答案 1

不需要,您不需要同步对对象属性的访问,甚至不需要在成员变量上使用。volatile

线程在将对象排队到“发生之前”对象之前执行的所有操作都将取消排队。这意味着第一个线程所做的任何更改对第二个线程都是可见的。这是并发集合的常见行为。请参阅 BlockingQueue 类文档的最后一段:BlockingQueue

内存一致性影响:与其他并发集合一样,线程中的操作在将对象放入另一个线程中之后的发生之前操作。BlockingQueueBlockingQueue

只要第一个线程在对对象进行排队后不进行任何修改,它就是安全的。


答案 2

您不需要自己执行同步,因为队列已经为您完成了同步。

可见性也得到保证。