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