LinkedBlockingQueue的插入和删除方法线程安全吗?

我在两个不同的线程之间使用。一个线程通过 添加数据,而另一个线程通过 接收数据。LinkedBlockingQueueaddtake

我的问题是,我是否需要同步访问 和 。的插入和删除方法线程安全吗?addtakeLinkedBlockingQueue


答案 1

是的。从文档中

“BlockingQueue 实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。但是,除非在实现中另有指定,否则大容量收集操作 addAll、containAll、retainAll 和 removeAll 不一定是以原子方式执行的。因此,例如,addAll(c)在仅添加c中的某些元素后可能会失败(引发异常)。


答案 2

是的,方法和是线程安全的,但有区别BlockingQueueadd()take()

add ()和方法使用2个不同的对象。take()ReentrantLock

add() 方法用法

private final ReentrantLock putLock = new ReentrantLock();

take()方法用法

private final ReentrantLock takeLock = new ReentrantLock();

因此,同步对方法的同步访问。同样,对方法的同时访问是 。add()take()synchronized

但是,对 add()take() 方法的同时访问不是同步的,因为它们使用 2 个不同的锁定对象(除非在队列已满/空的边缘条件下)。


推荐