2017-05-09 3 views
0

私はオブジェクトのハッシュマップを持っています。ハッシュマップへのアクセスは同期されます。各オブジェクトには、変更可能かどうかの条件があります。オブジェクトがcondition経由で利用できない場合、object.wait();現在のスレッドが待機します。それが利用可能である場合は、オブジェクトが変更され、その後、ハッシュマップに戻されます。ハッシュマップからオブジェクトを変更すると、複数のスレッドのwait()メソッドに影響しますか?

HashMap<String, Boolean> availabilityMap = new HashMap<String, Boolean>(); 
HashMap<String, Object> objectMap = new HashMap<String, Object>(); 
... 
... 

lock() { 
    while (!availabilityMap.get(objectName)) { 
      object = objectMap.get(objectName); 
      object.wait(); 
    } 
    availabilityMap.put(objectName, false); 
    object = objectMap.get(objectName); 
} 

object.attribute = newValue; 

lock() { 
    objectMap.put(objectName, object); 
    availabilityMap.put(objectName, true); 
    object = objectMap.get(objectName); 
    object.notify(); 
} 

セイスレッド1は、このオブジェクトの属性を変更して、スレッド2は、オブジェクトにアクセスするために待っています。 Thread1はそれを変更し終え、ハッシュマップに戻し、object.notify()を呼び出します。 thread2のそのオブジェクトはまだ通知を受け取りますか?

+3

あなたのコードは、現在そのオブジェクトに対して 'synchronized'されている場合に' notify'で 'wait'を呼び出すことしかできないので、あなたのコードは書かれた通りに動作しません。もしそうでなければ、あなたは 'IllegalMonitorStateException'を取得します。 –

答えて

1

あなたの質問はむしろあいまいです。 wait()方法に影響する唯一のものは、以下のとおりです。同じオブジェクトで呼び出さ

  1. notify()またはnotifyAll()
  2. Thread.interrupt()

notify()と1つのスレッドがwait()にある場合、そのスレッドは通知を受け取ります。複数のスレッドがwait()にある場合、そのうちの1つだけがそれを取得します。それはnotifyAll()のためです。

このスレッドは、このオブジェクトの属性を変更しており、スレッド2はオブジェクトにアクセスするのを待機しています。 Thread1はそれを変更し終え、ハッシュマップに戻し、object.notify()を呼び出します。 thread2のそのオブジェクトはまだ通知を受け取りますか?

もちろんです。何故なの?ハッシュマップからそれを取り出して戻すことは、それとは関係ありません。

関連する問題