我的LinkedBlockingQueue实现是否需要同步?

时间:2013-03-08 13:52:11

标签: java synchronization

首先,我使用了搜索,找到了与此问题相关的n个主题。不幸的是,他们没有帮助我,所以它将是n ++主题:)

情况:我将有很少的工作线程(同一个类,只有很多dublicates)(让我们称之为WT)和一个结果写线程(RT)。

WT会将对象添加到队列中,RT会接收它们。既然会有很多WT不存在任何内存问题(与最大队列大小无关)?那些操作会等待彼此完成吗?

此外,据我所知,BlockingQueue非常慢,所以也许我应该保留它并在同步块中使用正常的队列?或者我应该通过使用SynchronizedQueue来考虑自己?

1 个答案:

答案 0 :(得分:2)

LinkedBlockingQueue旨在处理写入同一队列的多个线程。来自documentation

  

BlockingQueue实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。但是,除非在实现中另有说明,否则批量Collection操作addAllcontainsAllretainAllremoveAll不一定以原子方式执行。

因此,您非常安全(除非您希望批量操作是原子操作)。

当然,如果线程A和线程B写入同一队列,除非您同步A和B,否则A项的相对于B项的顺序将是不确定的。

关于队列实现的选择,请选择最简单的工作,然后进行配置。这将为您提供关于瓶颈所在的准确数据,因此您无需猜测。