
SyncBlock*:指向實際同步區塊。Object*:弱引用回物件,供 GC 追蹤生命週期。
Monitor.Enter/Exit 的關鍵區域,對應 Win32 CRITICAL_SECTION。| 階段 | SyncBlockIndex 低 26 位 | 高 6 位旗標 | 說明 |
|---|---|---|---|
| 物件初始化 | 0 | 0 | 無同步區塊,無 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 後 GetHashCode | SyncBlock 索引 | 同上 | 新產生 HashCode 存入 SyncBlock.m_dwHashCode |
#define BIT_SBLK_IS_HASH_OR_SYNCBLKINDEX 0x08000000
#define BIT_SBLK_IS_HASHCODE 0x04000000
#define HASHCODE_BITS 26
#define MASK_HASHCODE ((1<
GetHashCode() 永穩定。三篇文章完整揭示:
lock / Monitor 背後的 AwareLock 與 SyncBlock 分配機制。GetHashCode() 如何複用 SyncBlockIndex 低 26 位儲存雜湊值。可見 CLR 團隊在記憶體佈局上極致優化,每一 bit 皆有明確用途。