我希望有一个布尔值来通知系统某些特定服务启动的部分。
由于一些奇怪的原因,我收到错误java.lang.IllegalMonitorStateException: object not locked by thread before notifyAll()
。
奇怪的是,notifyAll()位于一个synchronized块内,该块控制我调用notifyAll()的对象。
我的班级开头是这样的:
public class MyService {
public static Boolean notifier = Boolean.valueOf(false);
@Override
public void start() {
synchronized (MyService.notifier) {
MyService.notifier = Boolean.valueOf(true);
MyService.notifier.notifyAll();
}
}
@Override
public void stop() {
synchronized (MyService.notifier) {
MyService.notifier = Boolean.valueOf(false);
MyService.notifier.notifyAll();
}
}
...
}
我正在开发一个Android应用程序。我认为它不应该影响任何事情,但是如果影响java的工作方式,我会用该注释补充问题。
如果对象被锁定在同步块中,为什么会出现异常?
答案 0 :(得分:17)
该行
MyService.notifier = Boolean.valueOf(true);
交换您要锁定的对象,它会通过引用新对象来覆盖变量。因此,您在进入块时获得锁定的对象与您调用notifyAll
时的对象不同。所有notifyAll
都知道它没有获取对其被调用的对象的锁定,这是在输入同步块之后创建的新对象。
所有线程都需要使用相同的锁。就像Ian Roberts所说,锁是属于对象的。如果您覆盖对象,则会有新锁。