获取 java.lang.illegalMonitorStateException,如何解决?

Getting the java.lang.illegalMonitorStateException, how to fix it?

我有这个错误 "java.lang.illegalMonitorStateException",我不知道如何解决它。我知道 notifyAll() 似乎是原因,尽管我尝试了几种方法,例如放置同步块或其他东西,但我不太确定如何使用它。我习惯把 "synchronized" 这个词放在 "public" 之后,但这次我不能这样做。 基本上,每当 msgQueue 上有一条新消息时,我都需要唤醒 getNextMessage() 函数,同时它是 "blocked".

private LinkedList<NetClientSideMessage> msgQueue = new LinkedList<NetClientSideMessage>();


@Override
public ClientSideMessage getNextMessage() {
    //wait for messages
    if (hasNextMessage() == false)
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    // if connection is down, return null
    if (isConnected() == false)
        return null;

    return msgQueue.getFirst();

}

@Override
public boolean hasNextMessage() {
    // check if there are messages waiting in queue
    if (msgQueue.size() > 0) {
        notifyAll();
        return true;
    }
    return false;
}

您使用 wait/notifyAll 没有锁!你根本不能那样做。在方法声明中添加一个 synchronized 应该可以解决这个问题。

public synchronized ClientSideMessage getNextMessage() {
}

public synchronized boolean hasNextMessage() {
  ..
}