2012-09-26 44 views
8

我有一个消费者和一个生产者,从队列中添加和删除Item对象。如果我使用put()take()方法。我还需要覆盖哪些线程安全问题?这与有界缓冲区问题类似,我只是想知道是否使用阻塞队列取代了信号量或监视器的需要。 Item对象本身可能需要同步(setters,但getter不需要锁定),对吗?最后,我不太确定如何测试它是否是线程安全的,因为我不能同时使两个线程都调用take(),因为执行顺序是不确定的。有任何想法吗?谢谢。使用LinkedBlockingQueue足够好用于多线程Java程序吗?

+0

虽然执行的顺序是不确定的,不会有证据表明,LBQ不够好,如果你''把()''不会出现某些项目,或者来自''take()''的结果反复出现相同的项目项? –

+0

我想这是一个可能的测试,但它可能并不总是一个线程特定的测试。也许在调用take()时使用线程休眠,而其他线程也调用它? – Dan

+0

默认情况下,Executors使用的是什么,这导致了我的问题;你不能使用一个封装队列和线程池的ExecutorService吗? –

回答

7

这对你所做的事情来说是完全线程安全的,实际上这就是它的设计目的。的BlockingQueue的描述(其是由LinkedBlockingQueue实现的接口)规定:

BlockingQueue实现是线程安全。所有排队方法 使用并发控制的内部锁或其他形式 原子地实现其效果。

1

同时put()方法,并采取()是线程安全,因为它们使用2个不同的锁。

这是已经在这里找到答案:Are LinkedBlockingQueue's insert and remove methods thread safe?

+0

我按照链接找到了另一篇文章的答案,解释了为什么它是线程安全的。 http://stackoverflow.com/questions/26543807/is-blockingqueue-completely-thread-safe-in-java/26543940#26543940 – user1266174

相关问题