Heim  >  Fragen und Antworten  >  Hauptteil

java - 条件变量的await()释放锁吗?

譬如下面的两个条件变量 isEmpty和isFull
当调用他们的await()时,lock.lock()上的锁会被释放吗?

这里有3个对象,一个i哦是lock,一个是isEmpty,一个是isFull
上锁的对象是lock,而不是isEmpty或者isFull
那isFull或者isEmpty释放的锁确实lock上的?

private volatile boolean usedData = true;//mutex for data
private final Lock lock = new ReentrantLock();
private final Condition isEmpty = lock.newCondition();
private final Condition isFull = lock.newCondition();

public void setData(int data) throws InterruptedException {
    lock.lock();
    try {
        while(!usedData) {//wait for data to be used
            isEmpty.await();
        }
        this.data = data;
        isFull.signal();//broadcast that the data is now full.
        usedData = false;//tell others I created new data.          
    }finally {
        lock.unlock();//interrupt or not, release lock
    }       
}
高洛峰高洛峰2712 Tage vor1370

Antworte allen(2)Ich werde antworten

  • 迷茫

    迷茫2017-04-18 10:50:30

    await的doc有这么一句啊The lock associated with this Condition is atomically released

    Antwort
    0
  • PHP中文网

    PHP中文网2017-04-18 10:50:30

    谢邀,
    答案:

    会;
    是;
    

    await()的作用是能够让其他线程访问竞争资源,所以挂起状态就是要释放竞争资源的锁。 在java
    SE5的java.util.concurrent类库中,使用互斥并允许任务挂起的基本类就是Condition,你可以通过await()来挂起一个任务,当外部条件改变时,意味着某个任务可以继续执行,你可以通过signal()来通知这个任务。

    每个lock()的调用必须紧跟一个try-finally子句,用来保证在所有情况下都可以释放锁。任务在可以调用await(),signal(),signalAll()之前,必须拥有这个锁。

    Antwort
    0
  • StornierenAntwort