在notifyAll()之前未被线程锁定的同步对象

我想要一个布尔值来通知系统某些特定服务启动的部分。

出于某些奇怪的原因,我收到错误java.lang.IllegalMonitorStateException: object not locked by thread before notifyAll()

奇怪的是,notifyAll()位于一个synchronized块中,该块控制我调用notifyAll()的对象。

我的class级开头是这样的:

 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的工作方式,我会用该注释补充问题。

如果对象锁定在同步块中,为什么会出现exception?

这条线

 MyService.notifier = Boolean.valueOf(true); 

交换您锁定的对象,它会通过引用新对象来覆盖变量。 因此,在进入块时获得锁定的对象与您调用notifyAll不同。 所有notifyAll知道它没有获取对其被调用的对象的锁定,这是在输入同步块之后创建的新对象。

所有线程都需要使用相同的锁。 就像Ian Roberts所说,锁属于对象。 如果覆盖对象,则会有新锁。