[英]java synchronized on object vs synchronized on this
我想编写自己的简单信号量,并按如下所示进行操作:
class Semaphore {
private boolean done;
private final Object lock = new Object();
public Semaphore(boolean done){ this.done = done;}
public void acquire() throws InterruptedException {
synchronized (lock) {
while (!done)
lock.wait();
done = false;
}
}
public void release() {
synchronized (lock) {
done = true;
lock.notify();
}
}
}
它工作正常。 但是,如果我用synchize(this)代替synchronized(lock),它将开始引发IllegalMonitorStateException。 为什么这样?
正如@Alexei Kaigorodov在评论中提到的那样,当您将synced synchronized (lock)
替换为syncize synchronize (this)
。 然后,您还需要在代码中替换this
lock
。
因此, this
表明与lock
对象不同的当前对象。
现在,您用synchronize (this)
替换了synchronized (lock)
,这意味着现在您试图获取对当前对象的锁定,但是您正在等待Object类的对象。
这工作得很好:
public void acquire() throws InterruptedException {
synchronized (this) {
while (!done)
this.wait();
done = false;
}
}
public void release() {
synchronized (this) {
done = true;
this.notify();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.