現在のすべてのロックを解放しません()待って、それがどのように行うことができますか?

江南:

Javaのドキュメントによると、ときobj1.wait()、「他のスレッドを通知するまで、このモニタと待機のスレッドリリースの所有権を...」が起こります

現在のスレッドが待機している間ので、OBJ1のロックは、解放されます。しかし、どのような他のすべてのロックはどうですか?これは、コードの一部が、2つのオブジェクトをロックしていることが、可能です。

synchronized(obj2){
    f1();
    synchronized(obj1){
        f2();
        obj1.wait();
    }
}

OBJ2が解放されませんが、スレッドが実行されない、別のスレッドが無駄にOBJ2の解放を待っています...私はOBJ2の継続的なロックの理由を理解していません。そのままでもOK、それはあります。

しかし、どのように私は私がすべて、または少なくともいくつかの現在のロックを待っている時のためにロックを解除することができますどのように、よりよいこの待機を整理することができますか?

Marcono1234:

あなたは使用することができますロック sおよび条件よりも柔軟ですsのsychronized声明を。

あなたの例のためには、置き換えることができobj2ReentrantLock

Lock lock2 = new ReentrantLock();

try {
    // Blocks until the lock is acquired, just like a `synchronized` statement
    lock2.lock();
    f1();

    synchronized (obj1) {
        f2();
        lock2.unlock();
        obj1.wait();
        lock2.lock();
    }
}
// Use `finally` to make sure the lock is always released, even if an exception is thrown
finally {
    // Exception might have been thrown before current thread could acquire lock again, cannot 
    // unlock then
    if (lock2.isHeldByCurrentThread()) {
        lock2.unlock();
    }
}

しかし、これは、取得するために別のスレッドを可能にするlock2現在のスレッドが待って開始する前にobj1これが望ましくない場合は、置き換えることができobj1Lock代わりにして待ちますobj2

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=191042&siteId=1