首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

Java 多線程避坑指南:棄用方法、死鎖/活鎖/內存洩漏/資源耗盡四大經典故障

     編輯:J2EE

棄用方法:止损止血

JDK 1.2 棄用 Thread.stop()、suspend()、resume(),原因:

  • stop():強制釋放鎖 → 數據不一致
  • suspend()/resume():易死鎖(持鎖時掛起)
  • 替代方案:interrupt() + 協作式取消標誌

四大經典併發故障

1. 死鎖

循環等待資源鎖。解決:全局固定獲鎖順序(如 A→B→C→D)。

2. 活鎖

線程忙於響應外部事件(如不斷重試),無法推進實質工作。類比:秘書只接電話不打字。解決:引入退避策略、優先級調度。

3. 內存損壞

多線程非原子操作共享變量導致數據競爭。解決:synchronized、volatile、原子類、不可變對象。

4. 資源耗盡

線程數過多耗盡文件描述符、DB 連接等稀缺資源。解決:資源池化(連接池、線程池)。

大量線程調試神器:Probe 類

public class Probe extends Thread {
    public void run() {
        while (true) {
            Thread[] threads = new Thread[100];
            int n = Thread.enumerate(threads);
            for (int i = 0; i < n; i++) {
                Thread t = threads[i];
                System.out.printf("%s\t%d\t%b\t%b%n",
                    t.getName(), t.getPriority(), t.isAlive(), t.isDaemon());
            }
            Thread.sleep(5000);
        }
    }
}

定期打印所有線程名、優先級、存活狀態、守護標誌,快速定位泄漏/阻塞線程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved