java.util.concurrent.locks.Condition如何工作?

java.util.concurrent.locks.Condition如何工作?,java,multithreading,concurrency,locking,java.util.concurrent,Java,Multithreading,Concurrency,Locking,Java.util.concurrent,阅读有关Java.util.concurrent.locks.Condition接口的Java 8文档,给出以下示例: 类边界缓冲区{ 最终锁定=新的可重入锁定(); final Condition notFull=lock.newCondition(); 最终条件notEmpty=lock.newCondition(); 最终对象[]项=新对象[100]; int putptr、takeptr、count; 公共void put(对象x)抛出InterruptedException{ lock

阅读有关
Java.util.concurrent.locks.Condition
接口的Java 8文档,给出以下示例:

类边界缓冲区{
最终锁定=新的可重入锁定();
final Condition notFull=lock.newCondition();
最终条件notEmpty=lock.newCondition();
最终对象[]项=新对象[100];
int putptr、takeptr、count;
公共void put(对象x)抛出InterruptedException{
lock.lock();
试一试{
while(count==items.length)
未满。等待();
项目[putptr]=x;
如果(++putptr==items.length)putptr=0;
++计数;
notEmpty.signal();
}最后{
lock.unlock();
}
}
公共对象take()引发InterruptedException{
lock.lock();
试一试{
而(计数=0)
notEmpty.wait();
对象x=项目[takeptr];
如果(++takeptr==items.length)takeptr=0;
--计数;
notFull.signal();
返回x;
}最后{
lock.unlock();
}
}
}
所以我的主要问题是:条件是如何工作的

  • 它是否在开始等待时释放锁?(
    notFull.await()
    例如)
  • 不同的线程是否可以获得相同的锁并移动,直到它
    signal()
    a状态,从而唤醒其他线程
  • 我认为这个例子会导致死锁,因为如果一个线程正在等待缓冲区不是空的,并且它还没有释放锁,那么另一个线程如何获得锁,清空缓冲区,
    signal()
    现在条件满足了,如果等待缓冲区未满的线程未释放锁,则释放锁
  • 这些是初学者的问题。请帮帮我

    多谢各位

  • 是的,这是正确的,只要它等待一个条件,它就会释放锁
    wait/signal/signalAll
    的行为实际上与
    wait/notify/notifyAll
  • 不,ReentrantLock是独占锁,因此只有一个线程可以获取该锁
  • 见#1。当线程调用
    信号
    信号所有
    时,它分别释放一个线程或所有线程,等待相应的
    条件
    ,这样该线程或这些线程将有资格再次获得锁。但是现在锁仍然由调用
    signal
    signalAll
    的线程拥有,直到它通过调用
    lock.unlock
    显式释放锁为止。然后,已经释放/已经释放的线程将能够再次尝试获取锁,能够获取锁的线程将能够再次检查条件(在本例中,条件是指
    count==items.length
    count==0
    ),如果正常,它将继续,否则它将再次等待并释放锁,使其可用于另一个线程