public void test20() throws Exception { final Object obj1=new Object(); final Object obj2=new Object(); new Thread() { @Override public void run() { try { synchronized (obj1) { Thread.sleep(2000); synchronized (obj2) { System.out.println("thread1"); } } } catch (Throwable t) { t.printStackTrace(); } } }.start(); new Thread() { @Override public void run() { try { synchronized (obj2) { Thread.sleep(2000); synchronized (obj1) { System.out.println("thread2"); } } } catch (Throwable t) { t.printStackTrace(); } } }.start(); System.out.println("here"); System.in.read(); }