Deadlock means A is occupied, B is occupied, then A requires B and B requires A.
package thread.deadlock;
public class DeadLock2 extends Thread {
private Lock a = new Lock("A");
private Lock b = new Lock("B");
public DeadLock2() {
//It is the second thread.
Thread secondThread = new Thread(this, "2nd thread");
secondThread.start();
b.lock(a);
}
public class Lock {
private String name;
public Lock(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void lock(Lock lock) {
System.out.println(this.getName() + " is locked.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("If the lock " + lock.getName()
+ " is unlock, it continues.");
lock.printName();
}
public synchronized void printName() {
System.out.println(this.getClass().toString());
}
}
@Override
public void run() {
a.lock(b);
}
public static void main(String args[]) {
//DeadLock2 is the first thread.
new DeadLock2().start();
}
}
Output:
B is locked.
A is locked.
If the lock B is unlock, it continues.
If the lock A is unlock, it continues.
synchronized method(){}
==
method(){ synchronized(this){})