【发布时间】:2012-04-18 16:39:55
【问题描述】:
我有两个线程thread1和thread2
线程1内
synchronized(lock) {
lock.wait();
if(lock == null)
{execute1}
if(lock != null)
{execute2}
}
在线程 2 内
synchronized(lock) {
lock.notify();
lock = null;
}
首先调用thread1,然后调用thread2。
在 thread1 调用 wait 之后,它释放它的锁。并且 thread2 调用 notify 并将 lock 设置为 null。
现在,当 thread1 再次尝试获取锁时,为什么它没有抛出任何异常。由于锁被设置为 null 并且 thread1 尝试获取该锁,所以它在尝试获取锁时不应该抛出空指针异常。
如果它没有抛出任何异常,则 thread1 仍在读取锁值不为空。那么它不应该执行语句 {execute2} 吗?
【问题讨论】:
-
lock声明在哪里?它是Runnable/Thread扩展类的实例变量吗?它是方法的局部变量吗?我们需要有关代码的更多详细信息。 -
好吧,如果
lock真的是null,你的lock.wait()会抛出一个NPE。在任何情况下,您都在lock上进行同步,然后将其设置为null。发生这种情况时,无法保证对lock的更改可见。您应该在final对象上进行同步。 -
lock 是主类 A 中 Object 类型的实例变量。 lock = new Object();两个线程都扩展为可运行的。我正在从同一个 A 类启动两个线程。首先调用 thread1,然后调用 thread2。
标签: java