1. 程式人生 > 實用技巧 >java 執行緒死鎖

java 執行緒死鎖

java執行緒死鎖

java執行緒死鎖程式碼示例:

public class DeadLockTest {
    Lock lock1 = new ReentrantLock(true);
    Lock lock2 = new ReentrantLock(true);

    public void test1() throws InterruptedException {
        lock1.lock();
        Thread.sleep(3000);
        System.out.println("lock1");
        test2();
        lock1.unlock();
    }
    public void test2() throws InterruptedException {
        lock2.lock();
        Thread.sleep(3000);
        System.out.println("lock2");
        test1();
        lock2.unlock();
    }
    public static void main(String[] args) {
        final DeadLockTest deadLockTest = new DeadLockTest();

        Thread t1 = new Thread(new Runnable() {
            public void run() {
                try {
                    deadLockTest.test1();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread t2 = new Thread(new Runnable() {
            public void run() {
                try {
                    deadLockTest.test2();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();
        t2.start();
    }
}

先建立兩個執行緒鎖lock1、lock2,test1()方法中請求lock1鎖,鎖住test1,然後
讓執行緒1sleep(讓另一執行緒能夠有足夠時間請求對test2()的lock鎖),在test2()方法中請求lock2鎖,同樣讓執行緒2sleep,這樣兩個執行緒都有足夠時間獲取鎖。這樣就形成了兩個執行緒互相等待對方釋放鎖,不然程式就無法繼續執行下去,形成了死鎖的局面。

執行結果:

程式在這個情況下一直處於死鎖狀態,程式的狀態仍然處於執行狀態,只要兩個執行緒都不釋放手中的鎖,那麼程式就會一直僵持在這種狀態持續下去。