[Java] ConcurrentMap 分析和思考 2022-09-30 03:58 221阅读 0赞 预备知识:[Java HashMap and HashSet 的实现机制][Java HashMap and HashSet] 由预备知识可以知道hashmap 的存储结构为: ![0_1302245955dZO0.gif][] (图像来自[http://www.ibm.com/developerworks/cn/java/j-lo-hash/][http_www.ibm.com_developerworks_cn_java_j-lo-hash]) 也是说:一个hashmap 内部含有一个Entity 类行的数组,这个数组中的元素都是Entity。实际上我们放入map 中的key 和 value 就对应一个Entity 对象,这个Entity 对象包含一个key、value、hashcode(key 的)和一个Entity 的引用,通过这个引用,Entity 可以形成一个链表。在图中,蓝色矩形方框代表数组,橙色椭圆代表Entity 对象。 注意HashMap 类不是线程安全的。 ## ConcurrentMap 主要的子类是ConcurrentHashMap。 ## 原理:一个ConcurrentHashMap 由多个segment 组成,每个segment 包含一个Entity 的数组。这里比HashMap 多了一个segment 类。该类继承了ReentrantLock 类,所以本身是一个锁。当多线程对ConcurrentHashMap 操作时,不是完全锁住map, 而是锁住相应的segment 。这样提高了并发效率。 构造函数的分析: /\*\* \* Creates a new, empty map with a default initial capacity (16), \* load factor (0.75) and concurrencyLevel (16). \*/ public ConcurrentHashMap() \{ this(DEFAULT\_INITIAL\_CAPACITY, DEFAULT\_LOAD\_FACTOR, DEFAULT\_CONCURRENCY\_LEVEL); \} 这是ConcurrentHashMap 的无参构造函数,可以看到默认大小为16,负载因子0.75,并发级别为16. Put 函数的分析: /\*\* \* Maps the specified key to the specified value in this table. \* Neither the key nor the value can be null. \* \* <p> The value can be retrieved by calling the <tt>get</tt> method \* with a key that is equal to the original key. \* \* @param key key with which the specified value is to be associated \* @param value value to be associated with the specified key \* @return the previous value associated with <tt>key</tt>, or \* <tt>null</tt> if there was no mapping for <tt>key</tt> \* @throws NullPointerException if the specified key or value is null \*/ public V put(K key, V value) \{ if (value == null) throw new NullPointerException(); int hash = hash(key.hashCode()); return segmentFor(hash).put(key, hash, value, false); \} 可以看出通过hash() 函数得到key 的哈希值,在得到相应的segment,在通过segment 存储Entity。 同时为了避免“检测再修改”(有条件线程安全参见\[2\])等并发问题,ConcurrentHashMap 提供了putIfAbsent(K key, V value) 方法,当key 不存在时,添加。(key 的存在靠两个条件,一个是key的hashcode方法,另外一个是key 的equal 方法) 优点:由于对对应segment 加锁,而不是锁定整个map,并发性得到了提高。能够直接提高插入、检索以及移除操作的可伸缩性。 缺点:当遍历map 中的元素时,需要获取所有的segment 的锁,使用遍历时慢。锁的增多,占用了系统的资源。使得对整个集合进行操作的一些方法(例如 `size()` 或 `isEmpty()` )的实现更加困难,因为这些方法要求一次获得许多的锁,并且还存在返回不正确的结果的风险。 参考资料: 1 [通过分析 JDK 源代码研究 Hash 存储机制][http_www.ibm.com_developerworks_cn_java_j-lo-hash] 2 [Java 理论与实践: 并发集合类][Java _] 3 [Java 理论与实践: 构建一个更好的 HashMap][Java _ _ HashMap] [Java HashMap and HashSet]: http://blog.csdn.net/lihe2008125/archive/2010/10/09/5930186.aspx [0_1302245955dZO0.gif]: /images/20220708/cec35074236745e3a79156d1fd6b3a40.png [http_www.ibm.com_developerworks_cn_java_j-lo-hash]: http://www.ibm.com/developerworks/cn/java/j-lo-hash/ [Java _]: http://www.ibm.com/developerworks/cn/java/j-jtp07233/ [Java _ _ HashMap]: http://www.ibm.com/developerworks/cn/java/j-jtp08223/
相关 [Java] ConcurrentMap 分析和思考 预备知识:[Java HashMap and HashSet 的实现机制][Java HashMap and HashSet] 由预备知识可以知道hashmap 的存储结构为 痛定思痛。/ 2022年09月30日 03:58/ 0 赞/ 222 阅读
相关 由京东发货引发的思考和分析 在京东买了点东西,虽然价格不高几十块钱。 16号下的单2013-11-18 22:02:09才开始发货,之间的时间一直催促没有任何有效回应。第三方店铺-- 四川文轩网旗舰店- 曾经终败给现在/ 2022年09月18日 12:48/ 0 赞/ 150 阅读
相关 ConcurrentMap接口 ConcurrentMap接口 两个实现 ConcurrentHashMap ConcurrentSkipListMap 支持并发排序功能,弥补Concurr 今天药忘吃喽~/ 2022年05月14日 04:56/ 0 赞/ 315 阅读
相关 Atomic Variables and ConcurrentMap AtomicInteger The package `java.concurrent.atomic` contains many useful classes to pe 野性酷女/ 2022年05月14日 01:51/ 0 赞/ 314 阅读
相关 彻头彻尾的理解ConcurrentMap 转载:[https://blog.csdn.net/justloveyou\_/article/details/72783008][https_blog.csdn.net_ju ﹏ヽ暗。殇╰゛Y/ 2022年05月05日 12:58/ 0 赞/ 289 阅读
相关 软件测试行业趋势分析和思考 软件测试行业趋势分析和思考 (源文件地址:https://github.com/zhengwh/share-tech/blob/master/dev/the-t 短命女/ 2022年04月10日 09:56/ 0 赞/ 190 阅读
相关 Java集合--ConcurrentMap Java集合–ConcurrentMap 1 Map并发集合 1.1 ConcurrentMap ConcurrentMap,它是一个接口,是一个能够支持并发 我就是我/ 2022年03月15日 02:04/ 0 赞/ 285 阅读
相关 Java ConcurrentMap 接口 Java ConcurrentMap 接口 Java 集合框架的ConcurrentMap接口提供了一个线程安全的映射。也就是说,多个线程可以一次访问该映射,而不会影响映... 朱雀/ 2022年02月19日 12:04/ 0 赞/ 10867 阅读
相关 HashMap和ConcurrentMap性能测试 测试代码: public static void main(String[] args) { Map map=new HashMap(); 阳光穿透心脏的1/2处/ 2021年11月01日 18:46/ 0 赞/ 365 阅读
相关 Java中的Map【四】ConcurrentMap接口 所使用的jdk版本为1.8版本,先看一下ConcurrentMap<K,V>在JDK中Map的UML类图中的位置: ![watermark_type_ZmFuZ3poZW5n 港控/mmm°/ 2021年09月20日 23:20/ 0 赞/ 462 阅读
还没有评论,来说两句吧...