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也是使用了写时复制还能实现读写并行,而显然ConcrrentHashMap并没有实现写时复制,它是怎么保证读写并行时不会读取到不一致中间状态的呢?
问题解答
回答1:这篇文章解释的挺好的
相关文章:
1. node.js - 问个问题 Uncaught (in promise)2. angular.js - 如何控制ngrepeat输出的个数3. 如何解决docker宿主机无法访问容器中的服务?4. 网页爬虫 - python requests爬虫,如何post payload5. javascript - 求一款靠谱点的移动端图片查看器插件,老司机速进!6. CSS3 flex 如何让高度不等的同排等高?7. python3.x - python3.5.2安装时make报错求助8. 请教,关于python字典,合并相同值的键的实现方法9. mysql_replication - mysql读写分离时如果单台写库也无法满足性能怎么解决10. html - 这种错位的时间轴怎么布局,然后用css实现?

网公网安备