Does the position of the notify() call matter?(Java)

前端 未结 3 1782
醉酒成梦
醉酒成梦 2020-12-19 17:18

Suppose I have the following situation:

synchronized void someMethod() {
    ...
    try {
       wait();
    }catch(InterruptedException e) {
       System.         


        
相关标签:
3条回答
  • 2020-12-19 17:58

    These calls (i.e. Object#wait and Object#notify) need to be made within a synchronized block. Since your method is synchronized, the scope of the synchronized block includes everything within the method. Therefore, positioning is irrelevant to it.

    0 讨论(0)
  • 2020-12-19 18:12

    The position of the notify() call within the synchronized block does not matter because by definition, if you are still in the synchronized block, then you still hold the lock.

    Shouldn't the Thread be notified immediately when the call to notify() is made?

    Yes. Calling notify() puts one of the threads (if any) from the wait queue (waiting for the condition) into the blocked queue (waiting for the lock). This does happen immediately, but the awoken thread needs to get the lock before it can start running. So it is immediately moved out of the wait queue but is still waiting to get the lock.

    Btw, I would recommend writing this as this.wait() and this.notify() just to be explicit about which object is being affected.

    0 讨论(0)
  • 2020-12-19 18:16

    No, the position of the notify() call within the synchronized block does not matter.

    I recommend the style:

    class SomeClass {
      synchronized void someMethod() throws InterruptedException{
        ...
        while (! someCondition) {
          wait();
        } 
        ...
      }
    
      synchronized void someOtherMethod() {
        ...
        makeConditionValid();
        notifyAll();  
      }
    }
    

    Notice the use of a while loop around the wait call. Some JVMs can issue spurious notifies, so there is no guarantee that when a thread is notified, the original condition which caused it to wait is valid. Also, the woken up thread does not get to run until the notifying thread relinquishes the lock; so it is possible that by the time the waiting thread executes the condition is again invalid.

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