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

标签 java multithreading concurrency locking java.util.concurrent

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

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/

相关文章:

java - 禁用Tomcat中所有默认的HTTP错误响应内容

java - 如何使用回调来实现 session 模式?

java - 如何计算半径内的最大和最小纬度和经度值?

java - 如何应用程序在多个线程中访问相同的数组列表

java - 如何确定多部分POST请求Java的文件大小?

c - C 中的 fork 线程正在互相写入标准输出

c - 线程内读取错误的数组

java - java servlet 中多个线程访问的变量是否需要声明为 volatile?

swift - 你必须手动指定你的DispatchQueue是串行的吗?

java - 使用 last 方法在 Treeset 上并发