对于Java中的ArrayBlockingQueue,queue.add(element)是否锁定了它所在的线程?我有一个运行了几十个线程的应用程序,它们都将信息放入一个ArrayBlockingQueue中。线程无法在短时间内锁定。如果它们都将对象放入队列中,那么add方法是否会立即继续运行并让队列将来将对象放入自身中,还是等到它实际被放入队列中?
答案 0 :(得分:1)
ArrayBlockingQueue是Queue的实现,它还支持在检索元素时等待队列变为非空的操作,并在存储元素时等待队列中的空间可用。
如果可以在不超出队列容量的情况下立即执行此操作,则add方法会在此队列的尾部插入指定的元素,成功时返回true,如果此队列已满,则抛出IllegalStateException。
尝试将元素放入完整队列将导致操作阻塞;尝试从空队列中获取一个元素同样会阻塞。
创建后,无法更改容量。
答案 1 :(得分:1)
是的,当您在ArrayBlockingQueue
中调用add方法时,它将锁定以执行操作,或者它将如何使线程安全。你如何将你的对象放在多线程环境中的任何共享变量。你需要同步。你可以检查一些非阻塞集合(可以创建自己的链表)。你将添加你的值,然后一个守护程序线程将读取一个一个并排队。
JAVA实施
添加方法内部调用offer。如果您不想等待超过给定时间,可以使用public boolean tryLock(long timeout, TimeUnit unit)
public boolean offer(E e) {
checkNotNull(e);
final ReentrantLock lock = this.lock;
lock.lock();
try {
if (count == items.length)
return false;
else {
enqueue(e);
return true;
}
} finally {
lock.unlock();
}
}
答案 2 :(得分:0)
在使用java.util.concurrent.locks.ReentrantLock保护的ArrayBlockingQueue并发操作中。并且操作是同步的。将项添加到队列时,在排队操作完成后,添加操作将返回。