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

Java finalize() 執行次數與輸出不確定性:GC 線程與 System.out 銷毀順序競態

     編輯:程式設計疑難解答

代碼

public class Finalize {
    protected void finalize() { System.out.println("finalize"); }
    public static void main(String[] args) {
        new Finalize(); new Finalize();
        System.gc();
    }
}

現象

運行多次,輸出可能 0 行、1 行或 2 行 "finalize"。

原因

  • finalize() 確實被 GC 線程調用了兩次 (兩個對象)。
  • 但 System.out (PrintStream) 也是對象,JVM 關閉時會銷毀對象。**銷毀順序不確定**:
    • 若 System.out 先於兩個 Finalize 對象銷毀 → 輸出流關閉,println 無輸出 (0 行)。
    • 若一個 Finalize 先銷毀 → 輸出 1 行。
    • 若 System.out 最後銷毀 → 輸出 2 行。

結論

不可依賴 finalize 進行關鍵資源釋放或輸出**。應使用 try-with-resources、AutoCloseable 或顯式 close() 方法。

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