線程死鎖的典型案例

多線程編程過程中鎖運用不好,會產生死鎖問題,先自己寫了個死鎖產生的案例,可以幫助初學者去理解死鎖

/**
 * 模擬死鎖問題
 * 兩個線程窗口1先獲取object鎖,在獲取this鎖
 * 窗口2先獲得this鎖,在獲取object鎖
 */
public class DeadLockDemo implements Runnable {
    private int count = 100;
    boolean flag = true;
    // object鎖
    Object object = new Object();

    @Override
    public void run() {
        if (flag) {
            while (count > 0) {
                synchronized (object) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("窗口1準備售票");
                    saleTicket();
                }
            }

        } else {
            System.out.println("窗口2準備售票");
            while (count > 0) {
                saleTicket();
            }
        }
    }

    private synchronized void saleTicket() {
        synchronized (object) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (count > 0) {
                System.out.println(Thread.currentThread() + ":窗口售出的第:" + (100 - count + 1) + "張票");
                count--;
                System.out.println("剩餘票數:" + count);
            }
        }

    }

    public static void main(String[] args) {
        DeadLockDemo deadLockDemo = new DeadLockDemo();
        new Thread(deadLockDemo, "窗口1").start();
        try {
            Thread.sleep(40);
            deadLockDemo.flag = false;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(deadLockDemo, "窗口2").start();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章