題目描述
Java代碼模擬死鎖
死鎖條件
- 互斥使用:一個(gè)資源只能分配給一個(gè)線程
- 不可剝奪:資源只能由占有者釋放,申請(qǐng)者不能強(qiáng)制剝奪
- 請(qǐng)求保持:線程申請(qǐng)資源時(shí),保持對(duì)原有資源的占有
- 循環(huán)等待:存在一個(gè)進(jìn)程等待隊(duì)列:{P1 , P2 , … , Pn}, 其中P1等待P2占有的資源,P2等待P3占有的資源,…,Pn等待P1占有的資源,形成一個(gè)進(jìn)程等待環(huán)路
代碼
思路
- 定義兩個(gè)資源o1,o2
- 對(duì)象deadLock1占有資源o1,需要資源o2
- 對(duì)象deadLock2占有資源o2,需要資源o1
- 死鎖產(chǎn)生
代碼
public class DeadLock implements Runnable {
// flag=1,占有對(duì)象o1,等待對(duì)象o2
// flag=0,占有對(duì)象o2,等待對(duì)象o1
public int flag = 1;
// 定義兩個(gè)Object對(duì)象,模擬兩個(gè)線程占有的資源
public static Object o1 = new Object();
public static Object o2 = new Object();
public static void main(String[] args) {
DeadLock deadLock1 = new DeadLock();
DeadLock deadLock2 = new DeadLock();
deadLock1.flag = 0;
deadLock2.flag = 1;
Thread thread1 = new Thread(deadLock1);
Thread thread2 = new Thread(deadLock2);
thread1.start();
thread2.start();
}
public void run() {
System.out.println("flag: " + flag);
// deadLock2占用資源o1,準(zhǔn)備獲取資源o2
if (flag == 1) {
synchronized (o1) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("1");
}
}
}
// deadLock1占用資源o2,準(zhǔn)備獲取資源o1
else if (flag == 0) {
synchronized (o2) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println("0");
}
}
}
}
}