gpt4 book ai didi

类之间的 Java 共享条件抛出 IllegalMonitorStateException : null

转载 作者:行者123 更新时间:2023-12-02 02:31:01 25 4
gpt4 key购买 nike

我有这样的结构:
锁包装器 - 用于存储锁、条件和响应中的对象

public class LockWrapper{
private Lock lock;
private Condition myCondition;
private MyObject myObject;

public LockWrapper(Lock lock, Condition myCondition) {
this.lock = lock;
this.myCondition = myCondition;
}

public Condition getMyCondition() {
return myCondition;
}

public MyObject getMyObject() {
return myObject;
}

public void setObject(MyObject myObject) {
this.myObject = myObject;
}

public Lock getLock() {
return lock;
}

}

任务 - 插入线程池中执行。它向服务器发起请求,然后等待服务器响应。

public class MyTask implements Runnable{
private Lock lock = new ReentrantLock();
private Condition myCondition = lock.newCondition();
private MyWebSocketAPI api;

public MyTask(MyWebSocketAPI api) {
this.api = api;
}

@Override
public void run() {
lock.lock();
try {
// long randomLong = generateRandomLong();
api.sendRequest(randomLong, new LockWrapper(lock, myCondition));
myCondition.await();
//do something after we got a response
} finally{
lock.unlock();
}
}

}

WebSocket - 获取请求并通知任务有关响应

 public abstract class MyWebSocketAPI extends WebSocketClient {
//...
private Map<Long, LockWrapper> lockWrappers = new ConcurrentHashMap<>();

public void sendRequest(Long id, LockWrapper lockWrapper){
this.lockWrappers.put(id, lockWrapper);
//processRequest
}

@Override
public void onMessage(String message) {
LockWrapper lockWrapper = lockWrappers.get(message.get(0).getAsLong());

lockWrapper.getLock().lock();
try{
lockWrapper.setMyObject(new MyObject(message));
this.lockWrappers.put(message.get(0).getAsLong(), lockWrapper);
lockWrapper.getMyCondition().signalAll();
} finally {
lockWrapper.getLock().unlock();
}
}

//...
}

lockWrapper.getMyCondition().signalAll(); 抛出异常:

java.lang.IllegalMonitorStateException: null
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.signalAll(AbstractQueuedSynchronizer.java:1954)

当我尝试通知任务我们已获取其对象时,为什么我的条件会抛出此异常?我是否在某个地方犯了错误,或者 Java 不允许共享条件?

最佳答案

这是我在任务中的错误。问题是我在方法运行中创建全局和本地的锁定和条件。锁和条件具有相同的名称。在某些情况下,我使用 lock ,在某些情况下使用 this.lock (但这是两个不同的锁)。结果,在方法 onMessage 中,我的 Condition 和 Lock 没有连接在一起。删除重复项后,一切正常。

关于类之间的 Java 共享条件抛出 IllegalMonitorStateException : null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46176468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com