簡體   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