繁体   English   中英

java在对象上同步与在此同步

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM