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

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

我的问题是,我需要同步访问addtakeLinkedBlockingQueue的insert和remove方法是否线程安全?

是。 从文档 :

BlockingQueue的实现是线程安全的,所有的排队方法都是通过内部锁或其他forms的并发控制来实现自己的效果,然而批量操作addAll,containsAll,retainAll和removeAll不一定是primefaces地执行,除非在实现中另有规定。因此,例如,在添加c中的一些元素之后,addAll(c)可能会失败(引发exception)。

是的, 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个不同的锁对象(队列满/空边缘条件除外)。

简单来说,它肯定是线程安全的,否则它将不具备ThreadPoolExecutor存储元素的候选资格。

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