public class MyClass {
private static Object resourceA = new Object();
private static Object resourceB = new Object();
public static void main(String args[]) {
Thread threadA = new Thread( new Runnable() {
public void run() {
System.out.println(Thread.currentThread() + " getting A");
synchronized (resourceA) {
System.out.println(Thread.currentThread() + " got A");
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + " getting B");
synchronized (resourceB) {
System.out.println(Thread.currentThread() + " got B");
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
} );
Thread threadB = new Thread( new Runnable() {
public void run() {
System.out.println(Thread.currentThread() + " getting B");
synchronized (resourceB) {
System.out.println(Thread.currentThread() + " got B");
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + " getting A");
synchronized (resourceA) {
System.out.println(Thread.currentThread() + " got A");
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
} );
threadA.start();
threadB.start();
}
}