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

时间:2012-12-28 17:44:34

标签: 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();
        }
    }
    ...
}

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

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

1 个答案:

答案 0 :(得分:17)

该行

MyService.notifier = Boolean.valueOf(true);

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

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

相关问题