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

Ste*_*Kuo 52 java concurrency multithreading synchronization

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

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

Mat*_*hen 56

是.来自文档:

"BlockingQueue实现是线程安全的.所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现它们的效果.但是,除非在实现中另有说明,否则批量Collection操作addAll,containsAll,retainAll和removeAll不一定以原子方式执行.因此,例如,在仅添加c中的一些元素之后,addAll(c)可能会失败(抛出异常)."


Amr*_*dey 12

是的,BlockingQueue方法add()take()线程安全,但有区别.

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

add()方法用途

private final ReentrantLock putLock = new ReentrantLock();
Run Code Online (Sandbox Code Playgroud)

take() 方法用途

private final ReentrantLock takeLock = new ReentrantLock();
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这个答案是一个有效的观察,但错过了LinkedBlockingQueue的实现者意识到这个问题并解决了它.详情请访问:http://stackoverflow.com/questions/26543807/is-blockingqueue-completely-thread-safe-in-java/26543940#26543940 (6认同)