死鎖編碼及定位分析-----你應該瞭解的

是什麼

死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力干涉那它們都將無法推進下去,如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。
在這裏插入圖片描述

產生死鎖主要原因

  • 系統資源不足
  • 進程運行推進的順序不合適
  • 資源分配不當

代碼

package com.brian.interview.study.thread;

import java.util.concurrent.TimeUnit;

/**
 * Copyright (c) 2020 ZJU All Rights Reserved
 * <p>
 * Project: JavaSomeDemo
 * Package: com.brian.interview.study.thread
 * Version: 1.0
 * <p>
 * Created by Brian on 2020/2/14 11:50
 */

class HoldLockThread implements Runnable {

    private String lockA;
    private String lockB;

    public HoldLockThread(String lockA, String lockB) {
        this.lockA = lockA;
        this.lockB = lockB;
    }

    @Override
    public void run() {
        synchronized (lockA) {
            System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockA + "\t 嘗試獲得:" + lockB);
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lockB) {
                System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockB + "\t 嘗試持有:" + lockA);
            }
        }
    }
}

/**
 * 死鎖是指兩個或兩個以上的進程在執行過程中,
 * 因爭奪資源而造成的一種互相等待的現象,
 * 若無外力干涉那它們都將無法推進下去
 */
public class DeadLockDemo {
    public static void main(String[] args) {
        String lockA = "lockA";
        String lockB = "lockB";

        new Thread(new HoldLockThread(lockA, lockB), "ThreadAAA").start();
        new Thread(new HoldLockThread(lockB, lockA), "ThreadBBB").start();

        /**
         * linux     ps -ef | grep xxxx     ls -l
         * window 下的 java 運行程序   也有類似 ps 的查看進程的命令, 但是目前我們需要查看的只是 java
         *          jps = java ps           jps -l
         */
    }
}

解決

jps 命令定位進程號

在這裏插入圖片描述

jstack 找到死鎖查看

在這裏插入圖片描述

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