多執行緒死鎖案例以及檢視方法
阿新 • • 發佈:2020-09-06
多執行緒死鎖案例以及檢視方法
我們先定義一個類呼叫DeadLock
和OtherService
。
public class DeadLockTest { public static void main(String[] args) { DeadLock deadLock = new DeadLock(); OtherService otherService = new OtherService(); deadLock.setOtherService(otherService); otherService.setDeadLock(deadLock); new Thread(() -> { while (true) { deadLock.m1(); } }, "T1").start(); new Thread(() -> { while (true) { otherService.s2(); } }, "T2").start(); } }
public class DeadLock { private OtherService otherService; public void setOtherService(OtherService otherService) { this.otherService = otherService; } // DeadLock的例項的鎖-資源A private final Object LOCK = new Object(); public void m1() { synchronized (LOCK) { System.out.println("********m1********"); otherService.s1(); } } public void m2() { synchronized (LOCK) { System.out.println("********m2********"); } } }
public class OtherService { private DeadLock deadLock; public void setDeadLock(DeadLock deadLock) { this.deadLock = deadLock; } // OtherService的例項的鎖-資源B private final Object LOCK = new Object(); public void s1() { synchronized (LOCK) { System.out.println("========s1========"); } } public void s2() { synchronized (LOCK) { System.out.println("========s2========"); deadLock.m2(); } } }
可以看到:
執行緒一呼叫DeadLock
的m1
方法,m1
使用了DeadLock
的LOCK
鎖,m1
呼叫了OtherService
的s1
,s1
使用了DeadLock
的LOCK
鎖,執行緒二呼叫OtherService
的s2
,而s2
呼叫了DeadLock
的m2
,而m2使用的DeadLock的LOCK被m1搶佔著,所以就形成了死鎖。
接下來使用jps
和jstack
命令來看一下: