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

Java 多線程編程:被棄用方法與常見併發陷阱避坑指南

     編輯:Java 程式設計入門

堅決避免的棄用方法

為向後兼容保留的 stop()、suspend()、resume() 在 JVM 中可能引入微妙錯誤,Java 1.1/1.2 重大修訂後已棄用。雖名稱誘人,請抵制誘惑,絕不使用。

四大併發惡夢

  1. 死鎖:最常見。線程 A 需資源 X 但 B 持有 X 鎖,B 需 Y 但 A 持有 Y。解決:所有線程按相同順序獲取所有資源鎖。如資源 A、B、C、D,必須先鎖 A 再鎖 B……若線程 1 鎖 B、C,線程 2 鎖 A、C、D,此技術可能導致阻塞但永不死鎖。
  2. 活鎖:線程忙於應對新任務永無機會完成任務,最終超出緩衝區導致崩潰。如秘書需錄入信件但一直接電話,信永遠錄不完。
  3. 內存損壞:明智使用 synchronized 可完全避免。
  4. 資源耗盡:系統資源有限(文件描述符等)。線程過多或候選線程遠超可用資源時,必須使用資源池。最佳例:數據庫連接池。線程用完歸還池中。資源池亦稱資源庫。

大量線程調試利器:Probe 類

程序因大量線程難調試時,此類可派上用場:

public class Probe extends Thread {
    public Probe() {}
    public void run() {
        while (true) {
            Thread[] x = new Thread[100];
            Thread.enumerate(x);
            for (int i = 0; i < 100; i++) {
                Thread t = x[i];
                if (t == null) break;
                else System.out.println(t.getName() + " " + t.getPriority()
                    + " " + t.isAlive() + " " + t.isDaemon());
            }
        }
    }
}

定期打印所有線程名稱、優先級、存活狀態、是否守護線程,幫助定位併發問題。

現代最佳實踐

  • 用 ExecutorService + 有界隊列替代手動線程管理,天然防資源耗盡
  • 用 ReentrantLock + Condition 替代 synchronized + wait/notify,功能更強
  • 用 CompletableFuture、parallelStream 簡化併發編排
  • 死鎖檢測:jstack、VisualVM 線程轉儲分析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved