gpt4 book ai didi

java - 不同状态同步

转载 作者:行者123 更新时间:2023-12-01 15:25:32 26 4
gpt4 key购买 nike

我有两个线程thread1和thread2

线程1内

synchronized(lock) {  
lock.wait();
if(lock == null)
{execute1}
if(lock != null)
{execute2}
}

线程2内

synchronized(lock) {  
lock.notify();
lock = null;
}

首先调用线程 1,然后调用线程 2。
thread1 调用 wait 后释放其锁。并且thread2调用notify并将lock设置为null。
现在,当 thread1 尝试再次获取锁时,为什么它不抛出任何异常。由于锁设置为 null 并且 thread1 尝试获取该锁,因此在尝试获取锁时是否应该抛出空指针异常。
如果它没有抛出任何异常,则线程1仍在读取不为空的锁值。那么它不应该执行语句{execute2}吗?

最佳答案

您同步对象,而不是变量。监视器属于该对象。

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

然后,当线程 1 重新获得控制权时,将调用execute1,因为变量此时为空。

编辑

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

The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.

这应该表明该变量与过去用于指向同步/等待/通知的对象完全无关。

关于java - 不同状态同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10213963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com