死鎖是在多線程編程中常常遇到的問題,現在用java編寫一個簡單的死鎖程序。
程序在main()方法中啓動2個線程,“線程-A”和“線程-B”。 線程-A 先拿到 lockA,再尋求拿到 lockB;線程-B 先拿到locB,再需求拿到lockA,如下圖,於是變成循環等待,造成死鎖。
代碼
public class DeadLockDemo {
public static void main(String[] args) {
Object lockA = new Object();
Object lockB = new Object();
new Thread(new Runnable() {
@Override
public void run() {
String name = Thread.currentThread().getName();
synchronized (lockA) {
System.out.println(name + " got lockA, want LockB");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println(name + " got lockB");
System.out.println(name + ": say Hello!");
}
}
}
}, "線程-A").start();
new Thread(new Runnable() {
@Override
public void run() {
String name = Thread.currentThread().getName();
synchronized (lockB) {
System.out.println(name + " got lockB, want LockA");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockA) {
System.out.println(name + " got lockA");
System.out.println(name + ": say Hello!");
}
}
}
}, "線程-B").start();
}
}
運行結果:
線程-A got lockA, want LockB
線程-B got lockB, want LockA
程序死鎖了,每個線程都不能完成。
轉自:https://blog.csdn.net/xidianliuy/article/details/51568073