是什麼
死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力干涉那它們都將無法推進下去,如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。
產生死鎖主要原因
- 系統資源不足
- 進程運行推進的順序不合適
- 資源分配不當
代碼
package com.brian.interview.study.thread;
import java.util.concurrent.TimeUnit;
/**
* Copyright (c) 2020 ZJU All Rights Reserved
* <p>
* Project: JavaSomeDemo
* Package: com.brian.interview.study.thread
* Version: 1.0
* <p>
* Created by Brian on 2020/2/14 11:50
*/
class HoldLockThread implements Runnable {
private String lockA;
private String lockB;
public HoldLockThread(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA) {
System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockA + "\t 嘗試獲得:" + lockB);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockB + "\t 嘗試持有:" + lockA);
}
}
}
}
/**
* 死鎖是指兩個或兩個以上的進程在執行過程中,
* 因爭奪資源而造成的一種互相等待的現象,
* 若無外力干涉那它們都將無法推進下去
*/
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA, lockB), "ThreadAAA").start();
new Thread(new HoldLockThread(lockB, lockA), "ThreadBBB").start();
/**
* linux ps -ef | grep xxxx ls -l
* window 下的 java 運行程序 也有類似 ps 的查看進程的命令, 但是目前我們需要查看的只是 java
* jps = java ps jps -l
*/
}
}