同步中的不同状态

时间:2012-04-18 16:39:55

标签: java

我有两个主题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}?

1 个答案:

答案 0 :(得分:1)

您在对象上进行同步,而不是变量。监视器属于对象。

如果lock指向非null对象,然后等待它,将lock设置为null并不意味着什么,因为它是指向的对象等待并通知的lock

然后,当thread1重新获得控制权时,将调用execute1,因为变量在该点为null。

修改

由于您似乎误解了整个wait()notify()语义,这里是来自the Javadoc(强调我的)的相关引用:

  

当前主题必须拥有此对象的监视器。该线程释放此监视器的所有权,并等待直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象的监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并继续执行。

这应该向您显示该变量与用于指向同步/等待/通知的对象之后完全无关。