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

J-R*_*Rou 5 java multithreading synchronization synchronized java-threads

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

由于一些奇怪的原因,我收到了错误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();
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我正在研究一个Android应用程序.我认为它不应该影响任何事情,但是如果影响java的工作方式,我会用该注释补充问题.

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

Nat*_*hes 17

这条线

MyService.notifier = Boolean.valueOf(true);
Run Code Online (Sandbox Code Playgroud)

交换您要锁定的对象,它会使用对新对象的引用覆盖该变量.因此,您在进入块时获得锁定的对象与您正在调用的对象notifyAll不同.所有人都notifyAll知道它没有获得对它被调用的对象的锁定,这是在输入同步块之后创建的新对象.

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