多線程中的死鎖

一、死鎖:所謂死鎖是指多個線程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都無法向前推進。

二、如何避免死鎖

1、加鎖順序(線程按照一定的順序加鎖)---------本例就是採用這種方法

2、加鎖時限(線程嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,並釋放自己佔有的鎖),例如本例中的線程,佔了一個鎖又再請求另一個鎖。

package thread;

/**
 * 避免死鎖
 * 獲取鎖的順序
 * 核心所在:t1.join();
 * 把t1.join() 去掉就是demo01的死鎖了
 *
 * Created by sxf on 2018/6/27.
 */
public class DeadLockDemo02 {

    private int flag = 1;
    private static Object o1 = new Object();
    private static Object o2 = new Object();

    public static void main(String[] args) {

        final Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
               money(1);
            }
        });
        t1.start();

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    t1.join(); //*核心所在****************************************************
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                money(0);
            }
        });
        t2.start();
    }

    public static void money(int flag) {
        System.out.println("flag:" + flag);
        if (flag == 1) {
            synchronized(o1) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o2) {
                    System.out.println("1進來的");
                }
            }
        }

        if (flag == 0) {
            synchronized(o2) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized(o1) {
                    System.out.println("0進來的");
                }
            }
        }
    }
}

運行結果:

flag:1

1進來的

flag:0

0進來的


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