LinkedBlockingQueue的insert和remove方法是否安全?

时间:2010-04-23 00:23:54

标签: java multithreading concurrency synchronization

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

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

3 个答案:

答案 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的并发性。