[英]Does anyone know why I am getting this IllegalMonitorStateException?
[英]Why am I getting IllegalMonitorStateException with this code?
我有 2 個線程,一個調用 get() 方法,另一個調用 put() 方法。 我需要同步這些方法,以便在 put 之后才能看到 get 的結果。 我確實知道如何以其他方式執行此操作,但我想了解為什么我會使用此代碼獲取.IllegalMonitorStateException。
public class TransferObject {
private int value;
protected volatile boolean isValuePresent = false; //use this variable
public synchronized int get() {
synchronized (TransferObject.class) {
System.out.println("Got: " + value);
notify();
}
return value;
}
public void put(int value) {
synchronized (TransferObject.class) {
this.value = value;
System.out.println("Put: " + value);
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
這是2個線程的示例。
public class ConsumerTask implements Runnable {
private TransferObject transferObject;
protected volatile boolean stopped;
public ConsumerTask(TransferObject transferObject) {
this.transferObject = transferObject;
new Thread(this, "ConsumerTask").start();
}
public void run() {
while (!stopped) {
transferObject.get();
}
}
public void stop() {
stopped = true;
}
}
public class ProducerTask implements Runnable {
private TransferObject transferObject;
protected volatile boolean stopped;
static volatile AtomicInteger i = new AtomicInteger(0);
public ProducerTask(TransferObject transferObject) {
this.transferObject = transferObject;
new Thread(this, "ProducerTask").start();
}
public void run() {
while (!stopped) {
transferObject.put(i.incrementAndGet());
}
}
public void stop() {
stopped = true;
}
}
您有兩個線程和一個 object 用於鎖定TransferObject.class
。 當您的線程 ConsumerTask 獲得鎖定時, object TransferObject.class
沒有睡眠線程,當您為此監視器調用 notify() 時,您會收到IllegalMonitorStateException
從方法通知的描述中:
Wakes up a single thread that is waiting on this object's monitor.
您無需等待監視器TransferObject.class
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.