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所说,锁是属于对象的.如果覆盖对象,则会有新锁.