死鎖
死鎖發生的情況:創建兩個字節數組LockA和LockB,再創建兩個線程A和B,讓每個線程都用synchronized鎖住字節數組(A先鎖LockA,再嘗試去鎖定LockB;B先鎖LockB,再嘗試鎖定鎖定LockA),如果A鎖住LockA,B鎖住LockB,A就沒辦法鎖住LockB,B也沒辦法鎖住LockB,兩者相互等待,這時就陷入了死鎖。
代碼示例
package cn.edu.pzhu;
public class DeadLock {
//這種定義從一個大佬那兒學的
public static byte LockA[] = new byte[0];
public static byte LockB[] = new byte[0];
public static void main(String[] args) {
new Thread(new A()).start();
new Thread(new B()).start();
}
}
class A implements Runnable {
@Override
public void run() {
try {
System.out.println("A 準備鎖定 LockA");
synchronized (DeadLock.LockA) {
System.out.println("A 把 LockA 鎖定");
Thread.sleep(1000); // 讓A等一會,讓B有時間鎖定LockB
System.out.println("A 嘗試鎖定 LockB");
synchronized (DeadLock.LockB) {
System.out.println("A 把LockB鎖定");
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("A的鎖釋放");
}
}
class B implements Runnable {
@Override
public void run() {
try {
System.out.println("LockB 準備鎖定");
synchronized (DeadLock.LockB) {
System.out.println("B 把 LockB 鎖定");
System.out.println("B 嘗試鎖定 LockA");
synchronized (DeadLock.LockA) {
System.out.println("B 把 LockA 鎖定 ");
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("B的鎖釋放");
}
}
運行結果
如有不當之處歡迎指出!