ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java并发容器和框架

2022-08-01 22:01:17  阅读:193  来源: 互联网

标签:容器 ConcurrentHashMap Java 散列 并发 HashEntry put 操作 Segment


1、ConcurrentHashMap的实现原理和使用

1.1、使用ConcurrentHashMap的原因:

(1)线程不安全的HashMap:HashMap在并发操作的时候执行put操作会引起死循环,是因为多线程会导致HashMap的Entry链表会形成环形的数据结构,一旦形成环形的数据结构,Entry的next节点永不为空,就会产生死循环获取entry。

(2)HashTable效率低下

1.2、ConcurrentHashMap的结构

ConcurrentHashMap是由Segment数据结构和HashEntry数据结构组成的。Segment是一种可重入锁,HashEntry用于存储键值对数据,当发生并发时,只需要锁住对应的Segment即可(Se1gment一共有16个),这样大大增强了程序的并发性。

1.3、ConcurrentHashMap的操作

1、get操作:先经过一次再散列,然后使用这个散列值通过散列运算定位到Segment,再通过散列算法定位到元素。get操作的高效之处在于整个get过程不需要加锁,除非读到的是空值才会加锁重读。

2、put操作:由于put方法需要对共享变量进行写入操作,因此为了线程安全,在操作共享变量的时候必须要加锁。put方法首先定位到Segment,然后在Segment里进行插入操作。插入操作需要经过两个步骤:第一步是判断是否需要对Segment里面的HashEntry数组进行扩容,第二步定位添加元素的位置,然后将其放在HashEntry数组里面。

扩容的方法:在扩容的时候,首先会创建一个容量是原来容量两倍的数组,然后将原来数组中的元素进行再散列之后插入到新的数组中。为了高效,ConcurrentHashMap不会对整个容器进行扩容,而是只会对某个segment进行扩容。

后续的ConcurrentLinkedQueue以及BlockingQueue还需要进行额外的阅读和补齐

标签:容器,ConcurrentHashMap,Java,散列,并发,HashEntry,put,操作,Segment
来源: https://www.cnblogs.com/yfwei/p/16541990.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有