Maison  >  Questions et réponses  >  le corps du texte

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 Il y a quelques jours1369

répondre à tous(2)je répondrai

  • 迷茫

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

    La doc de wait a cette phrase : Le verrou associé à cette Condition est atomiquement libéré

    répondre
    0
  • PHP中文网

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

    Merci,
    Réponse :

    会;
    是;
    

    La fonction de wait() est de permettre à d'autres threads d'accéder à des ressources concurrentes, donc l'état suspendu consiste à libérer le verrou des ressources concurrentes. Dans la bibliothèque de classes java.util.concurrent de java
    SE5, la classe de base qui utilise l'exclusion mutuelle et permet de suspendre les tâches est Condition. Vous pouvez suspendre une tâche via wait(). Lorsque les conditions externes changent, cela signifie A. la tâche peut continuer à être exécutée et vous pouvez notifier la tâche via signal().

    Chaque appel à lock() doit être suivi d'une clause try-finally pour garantir que le verrou puisse être libéré en toutes circonstances. La tâche doit posséder ce verrou avant de pouvoir appeler wait(), signal(), signalAll().

    répondre
    0
  • Annulerrépondre