我正在将一个监视器保存在一个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吗?
答案 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块访问。