java ArrayBlockingQueue同时放置和获取是否会导致死锁?
ArrayBlockingQueue的take和put函数的作用如下:java ArrayBlockingQueue同时放置和获取是否会导致死锁?,java,concurrency,Java,Concurrency,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
`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()函数将在lock.lock()行等待,直到take()调用unlock()。我说得对吗?如果我是对的,就会出现僵局 不,美国的javadoc
与此条件相关的锁被自动释放
,并且
出于线程调度目的,当前线程被禁用,并且
在四件事中的一件发生之前处于休眠状态:[……]
因此,
Lock
对象被释放,可以被另一个线程获取。来自:“尝试将元素放入完整队列将导致操作阻塞;尝试从空队列中获取元素将类似地阻塞。”
我说的是Lock.Lock()的锁;和lock.unlock(),因为两个函数使用同一个lock对象。当take()在lock.lock()之后并在调用lock.unlock()之前在那里等待时,函数put()将在lock.lock()行被阻塞。@tomminotEmpty
引用从该lock
对象创建的条件
对象。当您对其调用wait
时,它会释放该锁。