我有一个消费者和一个生产者,可以从队列中添加和删除Item对象。如果我使用put()
和take()
方法。我还需要涵盖哪些线程安全问题?这类似于有界缓冲区问题,我只是想知道是否使用阻塞队列代替信号量或监视器的需要。 Item对象本身可能需要同步(setter但getter不需要锁定),我是对的吗?最后,我不太确定如何测试它是否是线程安全的,因为我不能同时使两个线程都调用take()
,因为执行顺序是不确定的。有任何想法吗?感谢。
答案 0 :(得分:7)
对于您正在做的事情来说,它是完全线程安全的,事实上这就是它的设计目标。 BlockingQueue
(由LinkedBlockingQueue
实现的接口)的描述说明:
BlockingQueue实现是线程安全的。所有排队方法 使用内部锁或其他形式以原子方式实现其效果 并发控制。
答案 1 :(得分:1)
同时put()和take()不 线程安全,因为它们使用2个不同的锁。
这已经在这里得到解答:Are LinkedBlockingQueue's insert and remove methods thread safe?