我想编写自己的简单信号量并按如下方式完成:
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)替换同步(锁),它就会开始抛出IllegalMonitorStateException。为什么会这样?
最佳答案
正如 @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();
}
}
关于java在对象上同步与在this上同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44926260/