我有一个对象的散列图。对哈希映射的访问是同步的。每个对象都有一个关于它是否可以被改变的条件。如果对象不能通过条件,object.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();
}
假设thread1正在更改此对象的属性,并且thread2正在等待访问该对象。 Thread1完成更改,将其放回到hashmap中,并调用object.notify()。 thread2中的该对象是否仍会收到通知?
答案 0 :(得分:1)
你的问题相当模糊。唯一会影响wait()
方法的是:
notify()
或notifyAll()
调用同一个对象。Thread.interrupt()
。如果notify()
且wait()
中只有一个线程,则该线程将收到通知。如果wait()
中有多个线程,则只有其中一个线程会获得它。这就是notifyAll()
的用途。
假设thread1正在更改此对象的属性,并且thread2正在等待访问该对象。 Thread1完成更改,将其放回到hashmap中,然后调用
object.notify()
。 thread2中的该对象是否仍会收到通知?
当然。为什么不?将它从hashmap中取出并放回去与它无关。