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

同步區塊索引深度解析(下):結構總結與 HashCode 與 Lock 共存機制

     編輯:關於.NET

同步區塊索引完整結構

SyncBlockIndex 結構圖

  • ObjectHeader.SyncBlockIndex:32 位整數,初始為 0。
  • 指向全域 SyncBlockEntry Table 索引(非直接指標,利於 CLR 動態擴展表格)。
  • 每個 SyncTableEntry 包含:
    • SyncBlock*:指向實際同步區塊。
    • Object*:弱引用回物件,供 GC 追蹤生命週期。

SyncBlock 內部結構

SyncBlock 結構

  • AwareLock:實現 Monitor.Enter/Exit 的關鍵區域,對應 Win32 CRITICAL_SECTION。
  • m_dwHashCode:當 SyncBlockIndex 需同時服務 HashCode 與 Lock 時,HashCode 移至此處保存。
  • ADIndex:AppDomain 索引,當 SyncBlockIndex 被佔用時存放於此。
  • SLink:雙重用途——活動時串聯等待執行緒佇列;回收時串聯空閒 SyncBlock 列表。

HashCode 與 Lock 共存的位元操作邏輯

階段SyncBlockIndex 低 26 位高 6 位旗標說明
物件初始化00無同步區塊,無 HashCode
呼叫 GetHashCode()HashCode 值BIT_SBLK_IS_HASHCODE (0x04000000) | BIT_SBLK_IS_HASH_OR_SYNCBLKINDEX (0x08000000)低 26 位直接儲存 HashCode
再作為 Lock 使用SyncBlock 索引BIT_SBLK_IS_HASHCODE | BIT_SBLK_IS_HASH_OR_SYNCBLKINDEX低 26 位變索引,原 HashCode 移至 SyncBlock.m_dwHashCode
先 Lock 後 GetHashCodeSyncBlock 索引同上新產生 HashCode 存入 SyncBlock.m_dwHashCode

關鍵常數定義 (Rotor 來源)

#define BIT_SBLK_IS_HASH_OR_SYNCBLKINDEX 0x08000000
#define BIT_SBLK_IS_HASHCODE             0x04000000
#define HASHCODE_BITS                    26
#define MASK_HASHCODE                    ((1<

設計精妙之處

  1. 單一 32 位整數透過高 6 位旗標動態切換語意,極度節省記憶體。
  2. 間接索引而非指標,允許 SyncBlock Table 任意遷移、擴展。
  3. 弱引用追蹤物件生命週期,配合 GC 自動回收同步資源。
  4. HashCode 持久化:即使索引改為指向 SyncBlock,原 HashCode 仍保留於 SyncBlock 中,確保 GetHashCode() 永穩定。

系列總結

三篇文章完整揭示:

  • (上) lock / Monitor 背後的 AwareLock 與 SyncBlock 分配機制。
  • (中) GetHashCode() 如何複用 SyncBlockIndex 低 26 位儲存雜湊值。
  • (下) 兩者共存時的旗標切換、HashCode 遷移與 SyncBlock 完整結構。

可見 CLR 團隊在記憶體佈局上極致優化,每一 bit 皆有明確用途。

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