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

Java 虛擬機棧:線程私有但數據可共享 — 區分棧幀所有權與引用可達性

     編輯:程式設計綜合問答

結論:**每個線程擁有獨立的 Java 虛擬機棧 (線程私有)**,但棧幀中引用的**堆對象可被多線程訪問** — 這就是「棧私有、數據可共享」的本質。

棧結構

  • **棧幀** 對應一次方法調用,包含:局部變量表、操作數棧、動態連接、方法返回地址。
  • **局部變量表** 存基本類型值、對象引用、`returnAddress`。
  • **線程私有** 意味著:線程 A 無法直接讀寫線程 B 的棧幀局部變量表槽位。

共享發生在何處


// 線程 A
Object obj = new Object(); // obj 引用在 A 的棧幀局部變量表
sharedRef = obj;           // 靜態字段/堆對象字段 持有引用

// 線程 B
Object o = sharedRef;      // B 從堆/靜態區讀取引用,指向同一堆對象
o.hashCode();              // B 訪問對象數據 — **共享的是堆對象,而非棧幀**
  • 線程間**不共享棧幀**,但可通過**堆/靜態區/線程對象** 間接持有對方棧幀中引用的對象。
  • 這就是為什麼「棧私有」不矛盾「數據共享」:共享的載體是**堆**,棧只存引用指針。

常見誤區

  • ❌ 「棧可以共享數據」 → 應說「棧中引用指向的堆數據可被共享」。
  • ❌ 「每個線程棧內容相同」 → 內容完全不同 (調用鏈、局部變量值)。

深入閱讀:《深入理解 Java 虛擬機》第 2 章「虛擬機棧」節。

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