获取 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() {
..
}
我有这个错误 "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() {
..
}