Java 从hashmap更改对象会影响多线程中的wait()方法吗?
我有一个对象的hashmap。对hashmap的访问是同步的。每个对象都有一个是否可以更改的条件。如果通过条件object.wait()对象不可用;调用,当前线程等待。如果可用,对象将被更改,然后放回hashmap:Java 从hashmap更改对象会影响多线程中的wait()方法吗?,java,multithreading,concurrency,locking,Java,Multithreading,Concurrency,Locking,我有一个对象的hashmap。对hashmap的访问是同步的。每个对象都有一个是否可以更改的条件。如果通过条件object.wait()对象不可用;调用,当前线程等待。如果可用,对象将被更改,然后放回hashmap: HashMap<String, Boolean> availabilityMap = new HashMap<String, Boolean>(); HashMap<String, Object> objectMap = new HashMap
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();
}
HashMap availabilityMap=newhashmap();
HashMap objectMap=新的HashMap();
...
...
锁(){
而(!availabilityMap.get(objectName)){
object=objectMap.get(objectName);
object.wait();
}
availabilityMap.put(objectName,false);
object=objectMap.get(objectName);
}
object.attribute=newValue;
锁(){
objectMap.put(objectName,object);
availabilityMap.put(objectName,true);
object=objectMap.get(objectName);
object.notify();
}
假设thread1正在更改此对象的属性,thread2正在等待访问该对象。Thread1完成对其的修改,将其放回hashmap,并调用object.notify()。thread2中的对象还会收到通知吗?您的问题相当模糊。影响
wait()
方法的唯一因素是:
notify()
或notifyAll()
Thread.interrupt()
notify()
中只有一个线程在wait()
中,则该线程将收到通知。如果有多个线程在wait()
中,则其中只有一个线程将获得它。这就是notifyAll()
的作用
假设thread1正在更改此对象的属性,thread2正在等待访问该对象。Thread1完成对其的修改,将其放回hashmap,并调用object.notify()
。thread2中的该对象仍然会收到通知吗
当然。为什么不呢?从hashmap中取出并放回与此无关 您的代码无法按编写的方式工作,因为如果您当前对该对象进行了
同步
,则只能在通知
上调用等待
。如果您没有,您将得到一个IllegalMonitorStateException