使用BlockingQueue时是否需要额外的同步?

Dav*_*ann 16 java multithreading synchronization

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

消息的实例化发生在线程A上,然后它被排入阻塞队列

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

鉴于这种情况,我是否需要同步getter/setter?也许这些属性会变化?或者我可以不同步而离开?

谢谢,希望我能澄清一下我在这里有什么.

eri*_*son 29

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

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

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

  • +1用于提及BlockingQueue的线程可见性语义. (2认同)