我有两个主题thread1和thread2
在thread1中
synchronized(lock) {
lock.wait();
if(lock == null)
{execute1}
if(lock != null)
{execute2}
}
在thread2中
synchronized(lock) {
lock.notify();
lock = null;
}
首先调用thread1,然后调用thread2
在thread1调用wait之后,它会释放它的锁。并且thread2调用notify并将lock设置为null
现在,当thread1再次尝试获取锁定时,为什么它不会抛出任何异常。因为lock设置为null并且thread1尝试获取该锁,所以在尝试获取锁时不应该抛出空指针异常。
如果它没有抛出任何异常,那么thread1仍然在读取锁定值而不是null。所以它不应该执行语句{execute2}?
答案 0 :(得分:1)
您在对象上进行同步,而不是变量。监视器属于对象。
如果lock指向非null对象,然后等待它,将lock
设置为null并不意味着什么,因为它是指向的对象等待并通知的lock
。
然后,当thread1重新获得控制权时,将调用execute1,因为变量在该点为null。
由于您似乎误解了整个wait()
和notify()
语义,这里是来自the Javadoc(强调我的)的相关引用:
当前主题必须拥有此对象的监视器。该线程释放此监视器的所有权,并等待直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象的监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并继续执行。
这应该向您显示该变量与用于指向同步/等待/通知的对象之后完全无关。