2013-03-08 54 views
0

首先,我使用了搜索并找到了与此问题相关的n个主题。不幸的是,他们没有帮助我,所以它会成为n ++的主题:)我的LinkedBlockingQueue实现需要同步吗?

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

WT会将对象添加到队列中,并且RT会采用它们。由于会有很多WT不会有任何内存问题(与最大队列大小无关)?这些行动是否会等待对方完成?

此外,据我所知,BlockingQueue是相当缓慢的,所以也许我应该离开它,并使用正常队列,而在同步块?还是应该通过使用SynchronizedQueue来考虑我的自我?

+1

programmers.stackexchange.com? – KevinDTimm 2013-03-08 13:55:49

回答

2

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

BlockingQueue实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制自动实现其效果。然而,批量Collection操作addAll,containsAll,retainAllremoveAll不一定以原子方式执行,除非在实现方式中另外指定。

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

当然,如果线程A和线程B被写入到相同的队列中,A的物品相对于B的项目的顺序将除非您同步A和B.

至于队列实现的选择是不确定的,最简单的工作,然后配置文件。这将为您提供有关瓶颈位置的准确数据,因此您不必猜测。

+0

+1非常真实,但我想再补充一点,但批量操作addAll,containsAll,retainAll和removeAll不一定是以原子方式执行,除非在实现中另行指定。因此,例如,在添加c中的一些元素后,addAll(c)可能会失败(抛出异常)。如此处所述http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html – 2013-03-08 14:11:10

相关问题