ConcurrentHashMap的源码分析-tabAt
生活随笔
收集整理的這篇文章主要介紹了
ConcurrentHashMap的源码分析-tabAt
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
該方法獲取對象中offset偏移地址對應的對象field的值。實際上這段代碼的含義等價于tab[i],?但是為什么不直接使用tab[i]來計算呢?
getObjectVolatile,一旦看到volatile關鍵字,就表示可見性。因為對volatile寫操作happen-before于volatile讀操作,因此其他線程對table的修改均對get讀取可見;
雖然table數組本身是增加了volatile屬性,但是“volatile的數組只針對數組的引用具有volatile的語義,而不是它的元素”。?所以如果有其他線程對這個數組的元素進行寫操作,那么當前線程來讀的時候不一定能讀到最新的值。
出于性能考慮,Doug Lea直接通過Unsafe類來對table進行操作。
static final <K,V> Node<K,V> tabAt(Node<K,V>[] tab, int i) { return (Node<K,V>)U.getObjectVolatile(tab, ((long)i << ASHIFT) + ABASE); }圖解分析
?
總結
以上是生活随笔為你收集整理的ConcurrentHashMap的源码分析-tabAt的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ConcurrentHashMap的源码
- 下一篇: ConcurrentHashMap的源码