Thursday, February 7, 2019

Thread concurrency: wait() and notify() / IllegalMonitorStateException

When a thread enters a synchronized block, it acquired the lock and becomes the owner of the lock. For example, if you have multiple threads reading from a queue, you do synchronized (queue) and the queue becomes the lock. Once thread T1 enters this synchronized block, it owns the queue lock.

Now, the queue is empty and there is nothing to read, so you want thread T1 to wait until the queue has something. The odd thing is that you cannot call T1.wait() or Thread.currentThread.wait() which will throw an IllegalMonitorStateException. Instead you call queue.wait(), which puts your thread into a Waiting state and makes it release the queue lock.

    synchronized (queue) {
         try {
                while(queue.isEmpty()){
                       queue.wait();
                 }
         } catch (InterruptedException e) {
                 System.out.println("Reader is waking up!");
         }

          Object value = queue.poll();
    }

Similarly, you have to call queue.notify() to change a Waiting thread into a Runnable one.

    synchronized (queue) {
          queue.add(obj);
           queue.notify()
    }

Rule of Thumb: Never use the wait() method together with nested synchronized blocks! A wait() call only releases one lock, and the thread enters the Waiting state holding the other lock, which is prone to deadlock.

When you use synchronized method, the object "this" is the lock. You may call this.wait() or just wait() in the synchronized method to make the thread go to the Waiting state and release the lock. And this.notify() will make a Waiting thread Runnable.

 -----------------------------------------------------------------------------------------------------------------
Watch the blessing and loving online channel: SupremeMasterTV live




If you have ever asked yourself these questions, this is the book for you. What is the meaning of life? Why do people suffer? What is in control of my life? Why is life the way it is? How can I stop suffering and be happy? How can I have a successful life? How can I have a life I like to have? How can I be the person I like to be? How can I be wiser and smarter? How can I have good and harmonious relations with others? Why do people meditate to achieve enlightenment? What is the true meaning of spiritual practice? Why all beings are one? Read the book for free here.


No comments:

Post a Comment