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

时间:2015-11-29 22:52:51

标签: java wait synchronized notify

我有这个错误“java.lang.illegalMonitorStateException”,我不知道如何解决它。我知道notifyAll()似乎是原因,虽然我尝试了几个东西,比如放置synchronized块或者其他东西,虽然我不太确定如何使用它。我习惯在“公众”之后加上“同步”这个词,但这次我不能这样做。 基本上我每次在msgQueue上有新消息时都需要唤醒getNextMessage()函数,同时它被“阻止”。

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;
}

1 个答案:

答案 0 :(得分:3)

您使用wait/notifyAll没有锁定!你根本无法做到这一点。在方法声明中添加synchronized应该修复它。

public synchronized ClientSideMessage getNextMessage() {
}

public synchronized boolean hasNextMessage() {
  ..
}