5

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

出于某种奇怪的原因,我收到了错误消息java.lang.IllegalMonitorStateException: object not locked by thread before 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();
        }
    }
    ...
}

我正在开发一个安卓应用程序。我认为它不会影响任何事情,但我会用该评论来补充这个问题,以防影响 java 的工作方式。

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

4

1 回答 1

17

线

MyService.notifier = Boolean.valueOf(true);

换出你锁定的对象,它用对新对象的引用覆盖变量。因此,您在进入块时获得锁定的对象与您正在调用notifyAll的对象不同。众所周知,它还没有获得被调用对象的锁,这notifyAll是进入同步块后创建的新对象。

所有线程都需要使用相同的锁。就像 Ian Roberts 所说,锁属于对象。如果您覆盖该对象,您将获得一个新锁。

于 2012-12-28T17:49:07.210 回答