java - ConcurrentHashMap中的get()方法為什么可以不加鎖?
問題描述
public V get(Object key) {Segment<K,V> s; // manually integrate access methods to reduce overheadHashEntry<K,V>[] tab;int h = hash(key);long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE;if ((s = (Segment<K,V>)UNSAFE.getObjectVolatile(segments, u)) != null && (tab = s.table) != null) { for (HashEntry<K,V> e = (HashEntry<K,V>) UNSAFE.getObjectVolatile (tab, ((long)(((tab.length - 1) & h)) << TSHIFT) + TBASE); e != null; e = e.next) {K k;if ((k = e.key) == key || (e.hash == h && key.equals(k))) return e.value; }}return null; }
為什么Vector的get就需要使用synchronized來加鎖而ConcurrentHashMap則不需要?而且CopyOnWriteArrayList也是使用了寫時(shí)復(fù)制還能實(shí)現(xiàn)讀寫并行,而顯然ConcrrentHashMap并沒有實(shí)現(xiàn)寫時(shí)復(fù)制,它是怎么保證讀寫并行時(shí)不會(huì)讀取到不一致中間狀態(tài)的呢?
問題解答
回答1:這篇文章解釋的挺好的
相關(guān)文章:
1. python - django 里自定義的 login 方法,如何使用 login_required()2. python如何不改動(dòng)文件的情況下修改文件的 修改日期3. angular.js - angularjs 用ng-reapt渲染的dom 怎么獲取上面的屬性4. angular.js - 不適用其他構(gòu)建工具,怎么搭建angular1項(xiàng)目5. mysql優(yōu)化 - mysql count(id)查詢速度如何優(yōu)化?6. 主從備份 - 跪求mysql 高可用主從方案7. css3 - [CSS] 動(dòng)畫效果 3D翻轉(zhuǎn)bug8. node.js - node_moduls太多了9. mysql主從 - 請(qǐng)教下mysql 主動(dòng)-被動(dòng)模式的雙主配置 和 主從配置在應(yīng)用上有什么區(qū)別?10. java8中,邏輯與 & 符號(hào)用在接口類上代表什么意思
![css3 - [CSS] 動(dòng)畫效果 3D翻轉(zhuǎn)bug](http://www.cgvv.com.cn/attached/image/news/202304/110831f073.png)