Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类之间的Java共享条件引发IllegalMonitorStateException:null_Java_Multithreading_Concurrency_Locking_Java.util.concurrent - Fatal编程技术网

类之间的Java共享条件引发IllegalMonitorStateException:null

类之间的Java共享条件引发IllegalMonitorStateException:null,java,multithreading,concurrency,locking,java.util.concurrent,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.myCond

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

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

    //...
 }

当我试图通知任务我们得到了它们的对象时,为什么我的条件会引发此异常?我是在什么地方出错了还是Java不允许共享条件?

这是我在
任务中的错误。问题是我在方法运行时创建了全局和局部的锁和条件。锁和条件具有相同的名称。在某些情况下,我使用的是
lock
,在某些情况下使用的是
this.lock
(但它是两个不同的锁)。结果,在message的方法
中,我的条件和锁没有连接在一起。

删除重复项后,一切正常。

@khelwood抱歉,编辑了代码。是的,它是锁包装器。在发出信号之前,你需要保持myCondition的锁。已同步(myCondition)。。。signalall()@JJF抱歉,可能我不理解并发中的某些内容。你能再解释一下吗?我想这两种情况我都已经掌握了。如何正确地获取锁?一个可能的选择是在某个地方创建
LockWrapper
,使用“错误”参数:传递的锁不拥有的条件。您可以将ctor更改为
LockWrapper(Lock Lock)
,删除
条件
arg,并在
LockWrapper
中创建该条件。当
消息
字符串时,如何执行
消息.get(0).getAsLong()
?张贴
java.lang.IllegalMonitorStateException: null
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.signalAll(AbstractQueuedSynchronizer.java:1954)