如果监视器作为值存储在散列映射中并被替换为null,则会发生什么

时间:2015-05-06 11:35:35

标签: java multithreading synchronization

我正在将一个监视器保存在一个hashmap中,并且在超时的情况下将其从hashmap中删除: ñ 线程1:

Object lock = map.get(lockName);
synchronized(lock) {
  // some actions
  lock.notifyAll();
}

主题2:

Object lock = map.get(lockName);
synchronized(lock) {
  lock.wait(timeout);
}
// some cleaning actions
map.put(lockName, null)

我的问题是:当我在地图中放置null时,notifyAll()会发生什么?是锁gc的参考?它会导致IllegalMonitoreStateException吗?

2 个答案:

答案 0 :(得分:2)

您基本上在询问b是否会在以下代码中变为空。

Object a = new Object();
Object b = a;

a = null;  // b won't become magically null

我建议你在继续使用对象监视器之前先刷新Java基础知识。

答案 1 :(得分:1)

垃圾收集基于不是reachable的对象:“可到达对象是任何可以从任何活动线程继续计算中访问的对象。”。

只要程序中的某个线程可以访问对象的任何引用,该对象仍然可以访问。它不能被垃圾收集,因此它的监视器仍然存在。

线程1 map.get调用将获得null或对锁对象的引用。如果获得null,则NullPointerException语句中会有synchronized。如果它获得对象的引用,则对象仍然可以通过synchronized块访问。