寫一個死鎖程序


死鎖在平時開發,尤其是多並發編程時是要避免,不過要自己刻意寫個死鎖還不一定容易,下面參考別人代碼寫一個

代碼

public class DeadLock implements Runnable{
    private int flag = 1;
    private static final Object o1 = new Object();
    private static final Object o2 = new Object();
    public void setFlag(int flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        if (flag == 1) {
            synchronized (o1) {
                System.out.println(Thread.currentThread().getName() + " o1");
                try {
                    Thread.sleep(800);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o2) {
                    System.out.println(Thread.currentThread().getName() + " o2");
                }
            }
        }
        if (flag == 2) {
            synchronized (o2) {
                System.out.println(Thread.currentThread().getName() + " o2");
                try {
                    Thread.sleep(800);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o1) {
                    System.out.println(Thread.currentThread().getName() + " o1");
                }
            }
        }
    }

    public static void main(String[] args) {
        DeadLock deadLock1 = new DeadLock();
        DeadLock deadLock2 = new DeadLock();

        deadLock1.setFlag(1);
        Thread thread1= new Thread(deadLock1, "Thread1");
        thread1.start();

        deadLock2.setFlag(2);
        Thread thread2= new Thread(deadLock2, "Thread2");
        thread2.start();
    }
}

說明

o1、o2是static類型屬於整個累,所以當定義deadLock1、deadLock2時是公用o1、o2的

deadLock1設置flag=1,先鎖住o1,然后睡800ms,此時

deadLock2設置flag=2,先鎖住o2,然后睡800ms

然后deadLock1開始鎖o2,不過o2還被deadLock2鎖着,只好等待。。。

此時deadLock1開始鎖01,不過o1還被deadLock1鎖着,只好等待。。。

相互等待造成死鎖

結果

Thread1 o1
Thread2 o2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM