Dynamic Lock-ordering Deadlock Solution

We have seen a dynamic lock ordering deadlock example previously.

One solution, according to suggestion from Java Concurrency in Practice, is to make use of System.identityHashCode to order objects. We can change the above program by introducing a method1 wrapper class that will send the objects in the correct order after checking its System.identityHashCode value. In a rare case, the values of System.identityHashCode may be same for both objects, and in this case we will use additional synchronization to make sure only one thread will call method1 and hence the order does not matter.

 

Dynamic lock-ordering solution program

package deadlock;

 

public class DynamicLockOrderingSolution {

  final static Object lockObject1 = new Object();

  final static Object lockObject2 = new Object();

  final static Object controlLock = new Object();

 

  public static void method1Wrapper(Object obj1, Object obj2) {

    int obj1Hash = System.identityHashCode(obj1);

    int obj2Hash = System.identityHashCode(obj2);

 

    if (obj1Hash < obj2Hash) {

      method1(obj1, obj2);

    } else if (obj1Hash > obj2Hash) {

      method1(obj2, obj1);

    } else {

      synchronized (controlLock) {

        method1(obj1, obj2);

      }

    }

  }

 

  public static void method1(Object obj1, Object obj2) {

    synchronized (obj1) { // Locking on obj1

      System.out.println(Thread.currentThread().getName()

          + ": Got obj1. Trying for obj2");

      try {

        Thread.sleep(500);

      } catch (InterruptedException e) {

        e.printStackTrace();

      }

 

      synchronized (obj2) // Locking on obj2

      {

        System.out.println(Thread.currentThread().getName()

            + ": Got obj2.");

      }

    }

  }

 

  public static void main(String[] args) {

    Thread t1 = new Thread() {

      public void run() {

        DynamicLockOrderingSolution.method1Wrapper(lockObject1, lockObject2);

      }

    };

    t1.setName("Thread A");

    t1.start();

 

    Thread t2 = new Thread() {

      public void run() {

        DynamicLockOrderingSolution.method1Wrapper(lockObject2, lockObject1);

      }

    };

    t2.setName("Thread B");

    t2.start();

  }

}

Just copy paste, execute, make changes and try to understand.

References and notes: 

Java Concurrency in Practice by Brian Goetz, David Holmes, DOug Lea, Tim Peierls, Joshua Bloch and Joseph Bowbeer. 

http://javajee.com/deadlock-in-operating-systems

Quick Notes Finder Tags

Activities (1) advanced java (1) agile (3) App Servers (6) archived notes (2) Arrays (1) Best Practices (12) Best Practices (Design) (3) Best Practices (Java) (7) Best Practices (Java EE) (1) BigData (3) Chars & Encodings (6) coding problems (2) Collections (15) contests (3) Core Java (All) (55) course plan (2) Database (12) Design patterns (8) dev tools (3) downloads (2) eclipse (9) Essentials (1) examples (14) Exception (1) Exceptions (4) Exercise (1) exercises (6) Getting Started (18) Groovy (2) hadoop (4) hibernate (77) hibernate interview questions (6) History (1) Hot book (5) http monitoring (2) Inheritance (4) intellij (1) java 8 notes (4) Java 9 (1) Java Concepts (7) Java Core (9) java ee exercises (1) java ee interview questions (2) Java Elements (16) Java Environment (1) Java Features (4) java interview points (4) java interview questions (4) javajee initiatives (1) javajee thoughts (3) Java Performance (6) Java Programmer 1 (11) Java Programmer 2 (7) Javascript Frameworks (1) Java SE Professional (1) JPA 1 - Module (6) JPA 1 - Modules (1) JSP (1) Legacy Java (1) linked list (3) maven (1) Multithreading (16) NFR (1) No SQL (1) Object Oriented (9) OCPJP (4) OCPWCD (1) OOAD (3) Operators (4) Overloading (2) Overriding (2) Overviews (1) policies (1) programming (1) Quartz Scheduler (1) Quizzes (17) RabbitMQ (1) references (2) restful web service (3) Searching (1) security (10) Servlets (8) Servlets and JSP (31) Site Usage Guidelines (1) Sorting (1) source code management (1) spring (4) spring boot (3) Spring Examples (1) Spring Features (1) spring jpa (1) Stack (1) Streams & IO (3) Strings (11) SW Developer Tools (2) testing (1) troubleshooting (1) user interface (1) vxml (8) web services (1) Web Technologies (1) Web Technology Books (1) youtube (1)