Java notifyAll()之前线程未锁定同步对象

Java notifyAll()之前线程未锁定同步对象,java,multithreading,synchronization,synchronized,java-threads,Java,Multithreading,Synchronization,Synchronized,Java Threads,我想要一个布尔值来通知系统的某些部分某个特定服务已启动 出于某种奇怪的原因,我得到了一个错误java.lang.IllegalMonitorStateException:对象在notifyAll()之前未被线程锁定。 奇怪的是notifyAll()位于一个同步块内,该块控制我调用notifyAll()的对象 我的课是这样开始的: public class MyService { public static Boolean notifier = Boolean.valueOf(false

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

出于某种奇怪的原因,我得到了一个错误
java.lang.IllegalMonitorStateException:对象在notifyAll()之前未被线程锁定。

奇怪的是notifyAll()位于一个同步块内,该块控制我调用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的工作方式

如果对象被锁定在同步块内,为什么会出现异常?

MyService.notifier = Boolean.valueOf(true);
调出要锁定的对象,它会用对新对象的引用覆盖变量。因此,在进入块时获得锁定的对象与您调用的
notifyAll
on的对象不同。所有
notifyAll
知道的是,它尚未获得正在调用的对象的锁,该对象是在输入同步块后创建的新对象


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

请查看,因为监视器属于对象,而不是字段。您正在同步
Boolean.FALSE
,但通知
Boolean.TRUE
(反之亦然);不要锁定可变对象,确保它是
final
您的代码比它需要的复杂得多,但我无法建议用什么替换它,除非看到您等待它的内容。(目前你可以全部删除)我怀疑你应该使用ExecutorService。谢谢。我被困在那里了。@J-Rou:很乐意帮忙。每个人都会偶尔陷入困境,这是一种职业危害。