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