ArrayBlockingQueue的take和put函数如下所示:
`final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
`
我的问题是假设现在队列中没有元素,我调用take()。然后调用线程将由notEmpty.await()等待,同时线程持有锁的监视器。如果我从另一个假设要将新元素添加到队列中的线程调用put(),则put()函数将在line lock.lock()行等待,直到take()调用unlock()。我对么?如果我是对的,就会出现僵局。
答案 0 :(得分:2)
不,Condition#await()
州的javadoc
与此
Condition
相关联的锁被原子释放和 当前线程因线程调度而被禁用 在发生四件事之一之前,他们处于休眠状态:[...]
所以Lock
对象被释放,可以被另一个线程获取。