notifyAll的前不被线程锁定同步对象()(synchronized object not lo

2019-07-17 16:19发布

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

对于一些奇怪的原因,我发现了错误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();
        }
    }
    ...
}

我工作的一个Android应用程序。 我不认为它应该有什么影响,但我与补充的情况下,这会影响Java的工作方式是评论的问题。

为什么我得到异常,如果对象被锁定synchronized块里面?

Answer 1:

该生产线

MyService.notifier = Boolean.valueOf(true);

换出你锁定的对象,它覆盖的变量,一个新的对象的引用。 所以,你在进入块获得锁的对象不是你调用同一个notifyAll上。 所有notifyAll知道是没有取得它被称为上的对象,这是在进入同步块之后创建的新对象的锁。

所有线程需要使用相同的锁定。 像伊恩·罗伯茨说,锁所属的对象。 如果覆盖了对象,你有一把新锁。



文章来源: synchronized object not locked by thread before notifyAll()