ConcurrentHashMap大量使用Unsafe的putOrderedObject出於什麼考慮

時間 2021-06-06 04:10:17

1樓:日光燈

題主看的應該是JDK1.7的ConcurrentHashMap原始碼。

// 儲存變數的引用到物件的指定的偏移量處,使用 volatile 的儲存語義

public

native

void

putObjectVolatile

(Objecto,

long

offset

,Objectx);

// 有序、延遲版本的 putObjectVolatile 方法,不保證值的改變被其他執行緒立即看到。

// 只有在 field 被 volatile 修飾符修飾時有效

public

native

void

putOrderedObject

(Objecto,

long

offset

,Objectx);

也就是說,相比 putObjectVolatile(),putOrderedObject() 不保證記憶體可見性,但是其效能比 putObjectVolatile() 要高。

為什麼可以選用不保證記憶體可見性的方法呢?

因為 setNext 方法在被呼叫的時候都會緊跟著後續的解鎖操作。

我們可以看看在 ConcurrentHashMap 中呼叫該方法的下述三個地方:

而JMM規定,unlock() 操作前,需要把改變的副本同步回主存。因此我們可以選用不保證可見性的 putOrderedObject() 方法,讓 unlock() 來保證記憶體可見性。

使用Evernote收藏了大量的資料,如何有效率的使用?

1 閱讀習慣 根據資訊的價值來選擇處理方式 緊急性 期限 重要性 價值 2 複習習慣 將知識強化為行動,如健康知識 飲食知識 學習時做筆記,定時定期彙總 整理為成果 根據重要性按不同頻率定時 日 周 月 季度 複習 PennSonic 你的這些資料是看著有用?沒有真正地使用麼?僅僅是看著有用何必收下...

如何評價 MIUI 的內建應用中大量使用 HTML5 製作的網頁介面來展示內容?

相裡 Felix 大環境是對運營的要求越來越高。要進一步做到精細化運營的前提和要求是需要有快速試錯的手段。在當前階段 Hybird 是價效比更高的選擇。MIUI 早期的特色是 功能 其他手機沒有的功能我們嗖嗖就給上了,填補空白,大快人心。做功能當然是 Native 好,效能又好又穩定,使用者也樂於公...

有哪些適合日常使用大量書寫的鋼筆,求推薦?

六時吉祥 再加一點,上百樂845,或者1000多來個743,百樂銥粒媲美萬寶龍,用個幾十年沒問題,筆尖比歐筆細,順滑,百樂筆中高階都是走設計簡捷大方低調不花哨的路線。845硬橡膠加生漆筆桿比普通樹脂殼更耐磨,是一支不錯的淡坑筆。 Martery 推薦德系筆,Lamy safari 和alstar,後...