java - 条件变量的await()释放锁吗?
高洛峰
高洛峰 2017-04-18 10:48:30
0
2
1454

譬如下面的两个条件变量 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
    }       
}
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(2)
迷茫

await のドキュメントには次の文があります: この条件に関連付けられたロックはアトミックに解放されます

いいねを押す +0
Ty80

ご招待ありがとうございます。
答え:

リーリー

await() の機能は、他のスレッドが競合するリソースにアクセスできるようにすることであるため、一時停止状態は競合するリソースのロックを解放することになります。 java
SE5のjava.util.concurrentクラスライブラリでは、相互排他を利用してタスクの一時停止を可能にする基本クラスがConditionです。外部条件が変化した場合、それは特定のタスクを一時停止することを意味します。タスクは実行を継続でき、signal() を通じてタスクに通知できます。

どのような状況でもロックを確実に解放できるように、各 lock() 呼び出しの後に try-finally 節を続ける必要があります。 タスクは、await()、signal()、signalAll() を呼び出す前に、このロックを所有している必要があります。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート