目錄
概述
死鎖案例 (面試)
如何排查死鎖
使用 JVM 工具排查死鎖
使用 jconsole 工具排查死鎖
細節
概述
死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力于涉那它們都將無法推進下去,如果系統資源充足,進程的資源請求都能夠得到滿足。
死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。
死鎖案例 (面試)
import java.util.concurrent.TimeUnit;public class DeadLockDemo {// 展示死鎖static Object lockA = new Object();static Object lockB = new Object();public static void main(String[] args) {new Thread(() ->{synchronized (lockA){System.out.println(Thread.currentThread().getName()+"\t"+"自己持有A鎖 期待獲得B鎖");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lockB){System.out.println(Thread.currentThread().getName()+"\t"+"在自己持有A鎖的情況下 獲取了B鎖");}}},"a").start();new Thread(() ->{synchronized (lockB){System.out.println(Thread.currentThread().getName()+"\t"+"自己持有A鎖 期待獲得B鎖");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lockA){System.out.println(Thread.currentThread().getName()+"\t"+"在自己持有A鎖的情況下 獲取了B鎖");}}},"b").start();}}
死鎖
如何排查死鎖
使用 JVM 工具排查死鎖
用 jps 查找進程信息
jps -l
用 jstack 追蹤堆棧信息
jstack 48660
使用 jconsole 工具排查死鎖
運行死鎖
打開 Java 監視和管理控制臺
檢測死鎖
細節
不可以 String 一把鎖