我在两个不同的线程之间使用LinkedBlockingQueue
。一个线程通过add
添加数据,而另一个线程通过take
接收数据。
我的问题是,我是否需要同步add
和take
的访问权限。 LinkedBlockingQueue
的插入和删除方法线程安全吗?
答案 0 :(得分:54)
是。来自the docs:
“BlockingQueue实现是 线程安全的。所有排队方法 用原子方式实现它们的效果 内部锁或其他形式的 并发控制。但是,批量 收集操作addAll, containsAll,retainAll和removeAll 不一定要执行 原则上除非另有说明 在实施中。就是这样 例如,对于addAll(c) 之后失败(抛出异常) 只添加一些元素 角“
答案 1 :(得分:12)
是的,BlockingQueue
方法add()
和take()
是线程安全的但有差异。
add ()
和take()
方法使用2个不同的ReentrantLock
对象。
add(
)方法使用
private final ReentrantLock putLock = new ReentrantLock();
take()
方法使用
private final ReentrantLock takeLock = new ReentrantLock();
因此,同步访问add()
方法是同步的。同样,对take()
方法的同时访问权限为synchronized
。
但是,同时访问add()
和take()
方法不是synchronized
,因为它们使用2个不同的锁定对象(队列已满/空的边缘条件除外)。 强>
答案 2 :(得分:0)
简单地说,它绝对是线程安全的,否则它不具备为 ThreadPoolExecutor 存储元素的候选资格。
只需添加和检索元素,无需担心BlockingQueue的并发性。