java同步对象vs同步这个

时间:2017-07-05 12:26:11

标签: java multithreading synchronize

我想编写自己的简单信号量并按如下方式完成:

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。为什么这样?

1 个答案:

答案 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();
    }
}