Are LinkedBlockingQueue's insert and remove methods thread safe?
Solution 1:
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:
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).