Java 如果监视器作为值存储在hashmap中,并被null替换,那么监视器会发生什么情况

Java 如果监视器作为值存储在hashmap中,并被null替换,那么监视器会发生什么情况,java,multithreading,synchronization,Java,Multithreading,Synchronization,我正在将监视器保存在hashmap中,如果超时,请将其从hashmap中删除: N 线程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

我正在将监视器保存在hashmap中,如果超时,请将其从hashmap中删除: N 线程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的引用吗?它会导致非法的MonitorStateException吗?

您基本上是在问
b
在下面的代码中是否会变为null

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

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

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

您基本上是在询问
b
在下面的代码中是否会变为null

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

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

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

您基本上是在询问
b
在下面的代码中是否会变为null

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

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

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

您基本上是在询问
b
在下面的代码中是否会变为null

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

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

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

垃圾收集基于对象不存在:“可访问的对象是可以从任何活动线程在任何潜在的连续计算中访问的任何对象。”

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


线程1
map.get
调用将获得一个
null
或对锁对象的引用。如果它得到一个
null
,则
synchronized
语句上将出现一个
NullPointerException
。如果获取了对对象的引用,则该对象仍然可以通过同步块访问。

垃圾收集基于对象不存在:“可访问对象是可以从任何活动线程在任何可能的连续计算中访问的任何对象。”

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


线程1
map.get
调用将获得一个
null
或对锁对象的引用。如果它得到一个
null
,则
synchronized
语句上将出现一个
NullPointerException
。如果获取了对对象的引用,则该对象仍然可以通过同步块访问。

垃圾收集基于对象不存在:“可访问对象是可以从任何活动线程在任何可能的连续计算中访问的任何对象。”

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


线程1
map.get
调用将获得一个
null
或对锁对象的引用。如果它得到一个
null
,则
synchronized
语句上将出现一个
NullPointerException
。如果获取了对对象的引用,则该对象仍然可以通过同步块访问。

垃圾收集基于对象不存在:“可访问对象是可以从任何活动线程在任何可能的连续计算中访问的任何对象。”

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



线程1
map.get
调用将获得一个
null
或对锁对象的引用。如果它得到一个
null
,则
synchronized
语句上将出现一个
NullPointerException
。如果它获得了对对象的引用,那么对象仍然可以通过同步块访问。

我认为这里不是b=a的场景;a=零;这里的情况可能是这样的:b=新对象();b=零;因此b将开始指向null。@dubey theHarcourtians否。
lock
变量对从映射中获取的对象有一个强引用,因此不会发生任何特殊情况。我认为当我们将对象引用作为参数传递,并且方法的这个局部变量开始指向null时,您的场景将适用,原始引用仍然指向object not null。我不知道这是不是-lock变量对该对象有强引用?让我检查一下lock object不能被map.put()替换。@dubey theHarcourtians-在OP显示的代码中,
map.put(lockName,null)
不能在其他语句(线程1和线程2)之前执行。因此,可以安全地假设当线程1读取时,
lock
不能为null。现在,由于某种原因,如果
lock
为空,那么行
synchornized(lock)
将为您提供
NPE
我认为这里不是b=a的场景;a=零;这里的情况可能是这样的:b=新对象();b=零;因此b将开始指向null。@dubey theHarcourtians否。
lock
变量对从映射中获取的对象有一个强引用,因此不会发生任何特殊情况。我认为当我们将对象引用作为参数传递,并且方法的这个局部变量开始指向null时,您的场景将适用,原始引用仍然指向object not null。我不知道这是不是-lock变量对该对象有强引用?让我检查一下lock object不能被map.put()替换。@dubey theHarcourtians-在OP显示的代码中,
map.put(lockName,null)
不能在其他语句(线程1和线程2)之前执行。因此,可以安全地假设当线程1读取时,
lock
不能为null。现在,由于某种原因,如果
lock
为空,那么行
synchornized(lock)
将为您提供
NPE
我认为这里不是b=a的场景;a=零;这里的情况可能是这样的:b=新对象();