寫一個死鎖程序

死鎖在平時開發,尤爲是多併發編程時是要避免,不過要本身刻意寫個死鎖還不必定容易,下面參考別人代碼寫一個html

代碼編程

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

說明

o一、o2是static類型屬於整個累,因此當定義deadLock一、deadLock2時是公用o一、o2的併發

deadLock1設置flag=1,先鎖住o1,而後睡800ms,此時ide

deadLock2設置flag=2,先鎖住o2,而後睡800msthis

而後deadLock1開始鎖o2,不過o2還被deadLock2鎖着,只好等待。。。spa

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

相互等待形成死鎖htm

結果blog

Thread1 o1
Thread2 o2
相關文章
相關標籤/搜索