江南:
Javaのドキュメントによると、ときobj1.wait()
、「他のスレッドを通知するまで、このモニタと待機のスレッドリリースの所有権を...」が起こります
現在のスレッドが待機している間ので、OBJ1のロックは、解放されます。しかし、どのような他のすべてのロックはどうですか?これは、コードの一部が、2つのオブジェクトをロックしていることが、可能です。
synchronized(obj2){
f1();
synchronized(obj1){
f2();
obj1.wait();
}
}
OBJ2が解放されませんが、スレッドが実行されない、別のスレッドが無駄にOBJ2の解放を待っています...私はOBJ2の継続的なロックの理由を理解していません。そのままでもOK、それはあります。
しかし、どのように私は私がすべて、または少なくともいくつかの現在のロックを待っている時のためにロックを解除することができますどのように、よりよいこの待機を整理することができますか?
Marcono1234:
あなたは使用することができますロック sおよび条件よりも柔軟ですsのsychronized
声明を。
あなたの例のためには、置き換えることができobj2
てReentrantLock
:
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
。これが望ましくない場合は、置き換えることができobj1
てLock
代わりにして待ちますobj2
。