How to avoid deadlock in Java is one of the question which is flavor of the season for multithreading , asked more at a senior level and with lots of follow up questions , though question looks very basic but most of developer get stuck once you start going deep.

questions starts with "What is deadlock ?"
answer is simple , when two or more threads waiting for each other to release lock and get stuck for infinite time , situation is called deadlock . it will only happen in case of multitasking.


How do you detect deadlock in Java ?
though this could have many answers , my version is first I would look the code if I see nested synchronized block or calling one synchronized method from other or trying to get lock on different object then there is good chance of deadlock if developer is not very careful.

other way is to find it when you actually get locked while running the application , try to take thread dump , in Linux you can do this by command "kill -3" , this will print status of all the thread in application log file and you can see which thread is locked on which object.

other way is to use jconsole , jconsole will show you exactly which threads are get locked and on which object.

once you answer this , they may ask you to write code which will result in deadlock ?
here is one of my version,

 public void method1(){

     synchronized(String.class){
            System.out.println("Aquired lock on String.class object");

            synchronized (Integer.class) {
                System.out.println("Aquired lock on Integer.class object");
            }
      }
}

public void method2(){
     synchronized(Integer.class){
        System.out.println("Aquired lock on Integer.class object");

          synchronized (String.class) {
              System.out.println("Aquired lock on String.class object");
          }
     }
}

If method1() and method2() both will be called by two or many threads , there is a good chance of deadlock because if thead 1 aquires lock on Sting object while executing method1() and thread 2 acquires lock on Integer object while executing method2() both will be waiting for each other to release lock on Integer and String to proceed further which will never happen.

Now interviewer comes to final part , one of the most important in my view ,How to fix deadlock ? or How to avoid deadlock in Java ?

if you have looked above code carefully you may have figured out that real reason for deadlock is not multiple threads but the way they access lock , if you provide an ordered access then problem will be resolved , here is
the fixed version.

public void method1(){
    synchronized(Integer.class){
       System.out.println("Aquired lock on Integer.class object");

       synchronized (String.class) {
          System.out.println("Aquired lock on String.class object");
       }
    }
}

public void method2(){
     synchronized(Integer.class){
          System.out.println("Aquired lock on Integer.class object");

         synchronized (String.class) {
            System.out.println("Aquired lock on String.class object");
         }
     }
}


Now there would not be any deadlock because both method is accessing lock on Integer and String object in same order . so if thread A acquires lock on Integer object , thread B will not proceed until thread A releases Integer lock , same way thread A will not be blocked even if thread B holds String lock because now thread B will not expect thread A to release Integer lock to proceed further.

Thanx for reading this post... :)
Ohk,So let me give you one code snippet guess the output if you are correct then you don't need to look further because your concept about the topic is clear well enough :) ,But incase if you can't get the right answer then go through this post it really helps you.

public class TestPostIncrement{
 public static void main(String args[]){
  int j=0;
  for(int i=0;i<100;i++){ 
    j=j++;
  }
  System.out.println(j); 
}
So what is your answer?

The output will be all zeros.... :)

All magic is happened at line j=j++; .

According to JAVA documentation assignments of this form:
lhs = rhs++;
is similar to doing something like this:
temp = rhs;
rhs = rhs+1;  // increment
lhs = temp;   // then assign
 So in our example, line
j=j++;
will be interpreted as:
temp=j;
j=j+1;
j=temp;
and in every iteration it will assign old value to variable j and gives u all zeros.

Plz post any comment as well as any suggestion to improve future posts....