java-LinkedBlockingQueue的insert和remove方法线程安全吗?

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

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

3个解决方案
55 votes

是。 从文档:

“ BlockingQueue实现是   线程安全的。 所有排队方法   原子地使用   内部锁或其他形式的   并发控制。 但是,大部分   收集操作addAll,   containsAll,retainAll和removeAll   不一定要执行   除非另有说明,否则原子地   在实施中。 就是这样   可能,例如对于addAll(c)   失败后(引发异常)   仅在其中添加一些元素   C。”

Matthew Flaschen answered 2020-01-14T15:29:33Z
12 votes

是的,add()方法take()synchronized是线程安全的,但有所不同。

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

add())方法使用

private final ReentrantLock putLock = new ReentrantLock();

add()方法使用

private final ReentrantLock takeLock = new ReentrantLock();

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

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

Amrish Pandey answered 2020-01-14T15:30:15Z
0 votes

是的,它绝对是线程安全的,否则就没有资格作为存储ThreadPoolExecutor元素的候选者。

只需添加和检索元素,而无需担心BlockingQueue的并发性。

Java Guru answered 2020-01-14T15:30:40Z
translate from https://stackoverflow.com:/questions/2695426/are-linkedblockingqueues-insert-and-remove-methods-thread-safe