notifyAll() throws IllegalMonitorStateException

前端 未结 4 384
后悔当初
后悔当初 2020-12-11 19:50

I am designing two threads: one has to get the name of players, and the second thread has to wait for the name being set in order to continue, but notify() all in the first

相关标签:
4条回答
  • 2020-12-11 20:05

    You're calling wait and notify without synchronizing on the thing you're waiting on or notifying. As documented in Object.notifyAll:

    Throws:
    IllegalMonitorStateException - if the current thread is not the owner of this object's monitor.

    So this:

    synchronized(nameSetLock){
      notifyAll();
    }
    

    should be:

    synchronized(nameSetLock){
      nameSetLock.notifyAll();
    }
    

    ... and ditto for wait. Note that your current code wouldn't even compile as you're using syncronized rather than synchronized, which suggests that you didn't post your actual code. It's possible that in typing out the code you've actually changed the problem - in which case you should edit your question to be more representative.

    0 讨论(0)
  • 2020-12-11 20:11

    It looks like your issue that you are using the lock incorectly. You synchronized block is on nameSetLock and you are calling your notifyall on your NameFetch object instance (which is the sayme a synchronized(this).

    You should do nameSetLock.wait when you want to use the lock and nameSetLock.notifyAll to notify.

    0 讨论(0)
  • 2020-12-11 20:16

    This happens to me when I forgot to add the synchronized in the method call.

    0 讨论(0)
  • 2020-12-11 20:24

    From the JavaDoc of IllegalStateException

      Thrown to indicate that a thread has attempted to wait on an object's 
      monitor or to notify other threads waiting on an object's  monitor
      without owning the specified monitor. 
    

    You are trying to invoke the wait() and notifyAll() without having that object lock.

    Please try what @Jon has suggested it will work.

    0 讨论(0)
提交回复
热议问题