簡體   English   中英

為什么我會使用此代碼獲得 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM