1. 程式人生 > 實用技巧 >多執行緒死鎖案例以及檢視方法

多執行緒死鎖案例以及檢視方法

多執行緒死鎖案例以及檢視方法

我們先定義一個類呼叫DeadLockOtherService

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();
        }
    }

}

可以看到:

執行緒一呼叫DeadLockm1方法,m1使用了DeadLockLOCK鎖,m1呼叫了OtherServices1,s1使用了DeadLockLOCK鎖,執行緒二呼叫OtherServices2,而s2呼叫了DeadLockm2,而m2使用的DeadLock的LOCK被m1搶佔著,所以就形成了死鎖。

接下來使用jpsjstack命令來看一下: