Rumah  >  Soal Jawab  >  teks badan

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
    }       
}
高洛峰高洛峰2763 hari yang lalu1416

membalas semua(2)saya akan balas

  • 迷茫

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

    Dokumen await mempunyai ayat ini: Kunci yang dikaitkan dengan Keadaan ini dilepaskan secara atom

    balas
    0
  • PHP中文网

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

    Terima kasih,
    Jawapan:

    会;
    是;
    

    Fungsi await() adalah untuk membenarkan urutan lain mengakses sumber yang bersaing, jadi keadaan yang digantung adalah untuk melepaskan kunci sumber yang bersaing. Dalam perpustakaan kelas java.util.concurrent java
    SE5, kelas asas yang menggunakan pengecualian bersama dan membenarkan tugasan digantung ialah Syarat Anda boleh menggantung tugas melalui await(Apabila keadaan luaran berubah, ini bermakna A tugas boleh terus dilaksanakan, dan anda boleh memberitahu tugas melalui signal().

    Setiap panggilan untuk mengunci() mesti diikuti dengan klausa cuba-akhir untuk memastikan kunci itu boleh dilepaskan dalam semua keadaan. Tugas mesti memiliki kunci ini sebelum ia boleh memanggil await(), signal(), signalAll().

    balas
    0
  • Batalbalas