Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从hashmap更改对象会影响多线程中的wait()方法吗?_Java_Multithreading_Concurrency_Locking - Fatal编程技术网

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

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。对hashmap的访问是同步的。每个对象都有一个是否可以更改的条件。如果通过条件object.wait()对象不可用;调用,当前线程等待。如果可用,对象将被更改,然后放回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