一個死鎖的例子

先舉個栗子。

/**
 * Created by Benjamin on 07/30/030.
 */
public class TestDeadLock implements Runnable {
    public int    flag = 1;
    static Object o1   = new Object(), o2 = new Object();

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

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

    public static void main(String[] args) {
        TestDeadLock t1 = new TestDeadLock();
        TestDeadLock t2 = new TestDeadLock();
        t1.flag = 1;
        t2.flag = 0;
        new Thread(t1).start();
        new Thread(t2).start();
    }
}
產生死鎖的原因主要是:
  • 系統資源不足
  • 資源分配不當
  • 推進順序不合適
產生死鎖的四個必要條件:
  • 互斥:一個資源每次只能被一個進程使用
  • 資源保持:一個進程被阻塞時,不釋放已有資源
  • 不可搶占:正在使用的資源不能被剝奪
  • 循環等待:循環等待未被分配的資源
例子死鎖的原因:

靜態對象o1和o2是類的資源。當flag=1的線程請求到o1資源時,再申請資源o2時,o2資源已經被flag=0的線程占有,并且后者需要申請資源o1才能繼續執行。這樣,二者就形成了相互等待的情形,故而形成死鎖。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、競態條件: 定義:競態條件指的是一種特殊的情況,在這種情況下各個執行單元以一種沒有邏輯的順序執行動作,從而導致...
    Hughman閱讀 1,337評論 0 7
  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,375評論 11 349
  • 知識點:一. 什么是線程: 進程是指運行中的應用程序,每一個進程都有自己獨立的內存空間。一個應用程序可以同時啟動多...
    木有魚丸啦閱讀 663評論 0 0
  • 1) 煮一杯溫酒, 君可初飲否? 啖食青梅挽香溢, 覆手難棄, 此去盼佳期。 2) 煮一杯溫酒, 君可復飲否? 又...
    季末未盈閱讀 800評論 0 0
  • 佩琦發微信跟我吐槽,比如佩琦媽媽愛在旁人面前議論她的私事,比如她覺得在家得不到她想要的關愛,比如她想有個完完全全屬...
    麥子飛呀飛閱讀 112評論 0 0