I encountered the issue like the Deadlocks and Synchronized methods. In this case, methodA, methodB, A.last() all must be the synchronized method. So I am going to resolve this issue by removing synchronized in the method B.last(). Any deadlock in this solution? Could you please let me know any solution to resolve this better?
Class A
{
  synchronized void methodA(B b)
  {
    b.last();
  }
   synchronized void last()
  {
    System.out.println(“ Inside A.last()”);
  }
}
Class B
{
  synchronized void methodB(A a)
  {
    a.last();
  }
  synchronized void last()
  {
    System.out.println(“ Inside B.last()”);
      }
}
Class Deadlock implements Runnable 
{
  A a = new A(); 
  B b = new B();
  // Constructor
  Deadlock()
  {
    Thread t = new Thread(this); 
    t.start();
    a.methodA(b);
  }
  public void run()
  {
    b.methodB(a);
  }
  public static void main(String args[] )
  {
    new Deadlock();
  }
}
				
                        
You can use a common mutex such as a ReentrantLock or synchronized blocks between the two methods instead of synchronized.
ReentrantLock example:
synchronized block example: