我想编写自己的简单信号量并按如下方式完成:
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();
}
}
}
它工作正常。但是如果我用同步(this)替换synchronized(lock),它就会开始抛出IllegalMonitorStateException。为什么这样?
答案 0 :(得分:2)
正如@Alexei Kaigorodov在评论中提到的,当您用synchronized (lock)
替换synchronize (this)
时。然后,您还需要在代码中将lock
替换为this
。
由于this
表示当前对象与lock
对象不同。
现在,您将synchronized (lock)
替换为synchronize (this)
,这意味着您现在尝试获取当前对象的锁,但是您正在等待Object类的对象。
这绝对没问题:
public void acquire() throws InterruptedException {
synchronized (this) {
while (!done)
this.wait();
done = false;
}
}
public void release() {
synchronized (this) {
done = true;
this.notify();
}
}