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

Java 我的LinkedBlockingQueue实现是否需要同步?,java,synchronization,Java,Synchronization,首先,我使用了搜索,找到了与这个问题相关的n个主题。不幸的是,他们没有帮助我,所以这将是n++主题:) 情境:我将有几个工作线程(同一个类,只有许多双副本)(让我们称它们为WT)和一个结果编写线程(RT) WT将向队列中添加对象,RT将获取这些对象。因为将有许多WT,所以不会有任何内存问题(与最大队列大小无关)?这些操作是否会等待对方完成 此外,据我所知,BlockingQueue相当慢,所以我可能应该离开它,在同步块中使用普通队列?或者我应该通过使用同步队列来考虑我自己吗?< /P> < P>

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

情境:我将有几个工作线程(同一个类,只有许多双副本)(让我们称它们为WT)和一个结果编写线程(RT)

WT将向队列中添加对象,RT将获取这些对象。因为将有许多WT,所以不会有任何内存问题(与最大队列大小无关)?这些操作是否会等待对方完成


此外,据我所知,BlockingQueue相当慢,所以我可能应该离开它,在同步块中使用普通队列?或者我应该通过使用同步队列来考虑我自己吗?< /P> < P> <代码> LinkedBlockingQueue < /代码>被设计来处理多个线程写入同一个队列。从:

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

因此,您是相当安全的(除非您预期批量操作是原子的)

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


至于队列实现的选择,请使用最简单的队列实现,然后配置文件。这将为您提供有关瓶颈位置的准确数据,因此您无需猜测。

programmers.stackexchange.com?+1非常正确,但我想补充一点,即批量收集操作addAll、containsAll、,除非在实现中另有规定,否则保留和移除不一定以原子方式执行。因此,例如,addAll(c)在只添加c中的一些元素之后失败(引发异常)是可能的。如此处所述