LinkedBlockingQueue的insert和remove方法是否线程安全?
我在两个不同的线程之间使用LinkedBlockingQueue
。 一个线程通过add
添加数据,而另一个线程通过take
接收数据。
我的问题是,我需要同步访问add
和take
。 LinkedBlockingQueue
的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的并发性。