Are LinkedBlockingQueue's insert and remove methods thread safe?

JavaMultithreadingConcurrencySynchronization

Java Problem Overview


I'm using LinkedBlockingQueue between two different threads. One thread adds data via add, while the other thread receives data via take.

My question is, do I need to synchronize access to add and take. Is LinkedBlockingQueue's insert and remove methods thread safe?

Java Solutions


Solution 1 - Java

Yes. From the docs:

> "BlockingQueue implementations are > thread-safe. All queuing methods > achieve their effects atomically using > internal locks or other forms of > concurrency control. However, the bulk > Collection operations addAll, > containsAll, retainAll and removeAll > are not necessarily performed > atomically unless specified otherwise > in an implementation. So it is > possible, for example, for addAll(c) > to fail (throwing an exception) after > adding only some of the elements in > c."

Solution 2 - Java

Yes, BlockingQueue methods add() and take() are thread safe but with a difference.

add () and take() method uses 2 different ReentrantLock objects.

add() method uses

private final ReentrantLock putLock = new ReentrantLock();

take() method uses

private final ReentrantLock takeLock = new ReentrantLock();

Hence, simultaneous access to add() method is synchronized. Similarly, simultaneous access to take() method is synchronized.

But, simultaneous access to add() and take() method is not synchronized since they are using 2 different lock objects (except during edge condition of queue full / empty).

Solution 3 - Java

Simply Yes, its definitely thread safe otherwise it wouldn't have qualified as a candidate for storing element for ThreadPoolExecutor.

Simply add and retrieve element without worrying about concurrency for BlockingQueue.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSteve KuoView Question on Stackoverflow
Solution 1 - JavaMatthew FlaschenView Answer on Stackoverflow
Solution 2 - JavaAmrish PandeyView Answer on Stackoverflow
Solution 3 - JavaJava GuruView Answer on Stackoverflow