从hashmap更改对象会影响多个线程中的wait()方法吗?

时间:2017-05-09 00:40:58

标签: java multithreading concurrency locking

我有一个对象的散列图。对哈希映射的访问是同步的。每个对象都有一个关于它是否可以被改变的条件。如果对象不能通过条件,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中的该对象是否仍会收到通知?

1 个答案:

答案 0 :(得分:1)

你的问题相当模糊。唯一会影响wait()方法的是:

  1. notify()notifyAll()调用同一个对象。
  2. Thread.interrupt()
  3. 如果notify()wait()中只有一个线程,则该线程将收到通知。如果wait()中有多个线程,则只有其中一个线程会获得它。这就是notifyAll()的用途。

      

    假设thread1正在更改此对象的属性,并且thread2正在等待访问该对象。 Thread1完成更改,将其放回到hashmap中,然后调用object.notify()。 thread2中的该对象是否仍会收到通知?

    当然。为什么不?将它从hashmap中取出并放回去与它无关。