2017-05-09 38 views
0

我有一個對象的散列表。訪問hashmap是同步的。每個對象都有一個關於它是否可以改變的條件。如果對象不適用於條件,則object.wait();被調用並且當前線程等待。如果可用,該對象被修改,然後放回HashMap的:從哈希映射中更改對象是否會影響多個線程中的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正在改變這個對象的屬性,及線程正在等待訪問對象。 Thread1完成更改,將其放回散列映射中,並調用object.notify()。 線程2中的對象是否仍然收到通知?

+3

你的代碼不會按照寫入的方式工作,因爲如果你當前在該對象上是'synchronize',那麼你只能在'notify'上調用'wait'。如果你不是,你會得到一個'IllegalMonitorStateException' –

回答

1

你的問題很模糊。這將影響wait()方法的唯一事情是:

  1. notify()notifyAll()調用同一個對象。
  2. Thread.interrupt()

如果你notify()只有一個線程在wait(),該線程將得到通知。如果wait()中有多個線程,則只有其中一個線程可以獲得它。這就是notifyAll()的用途。

假設thread1正在改變這個對象的屬性,並且thread2正在等待訪問該對象。 Thread1完成更改,將其放回散列映射中,並調用object.notify()。 thread2中的對象是否仍然會收到通知?

當然。爲什麼不?把它從hashmap中取出並放回去與它無關。