ArrayBlockingQueue
的任何一个操作都不与其他任何操作并发;他们总是采取同样的锁。即使对于size()
方法,也需要锁定。
public int size() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return count;
} finally {
lock.unlock();
}
}
对于LinkedBlockingQueue
的实现,你有两个锁:put和take。
对于size()
,它使用AtomicInteger
,因此不需要锁定。
所以我的问题是:为什么这个实现在并发包中 - ArrayBlockingQueue
真的并发?
答案 0 :(得分:7)
ArrayBlockingQueue
位于java.util.concurrent
包中,因为多个线程可以同时使用该对象而不会出现线程安全问题。
同时使用多种方法的能力不该对象的用途。