8

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

4

2 回答 2

7

对于您正在做的事情来说,它是完全线程安全的,事实上这就是它的设计目的。BlockingQueue(这是由 实现的接口)的描述LinkedBlockingQueue状态:

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

于 2012-09-26T06:59:17.710 回答
1

同时 put() 和 take()不是 线程安全的,因为它们使用 2 个不同的锁。

这已经在这里得到了回答:LinkedBlockingQueue 的插入和删除方法是线程安全的吗?

于 2014-09-08T04:03:30.153 回答