聊聊并发(4):深入分析concurrenthashmap-java开发java经验技巧

聊聊并发(4):深入分析concurrenthashmap-java开发java经验技巧

ID:30849421

大小:105.25 KB

页数:9页

时间:2019-01-04

聊聊并发(4):深入分析concurrenthashmap-java开发java经验技巧_第1页
聊聊并发(4):深入分析concurrenthashmap-java开发java经验技巧_第2页
聊聊并发(4):深入分析concurrenthashmap-java开发java经验技巧_第3页
聊聊并发(4):深入分析concurrenthashmap-java开发java经验技巧_第4页
聊聊并发(4):深入分析concurrenthashmap-java开发java经验技巧_第5页
资源描述:

《聊聊并发(4):深入分析concurrenthashmap-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、聊聊并发(4):深入分析ConcurrcntHashMap-编程开发技术聊聊并发(4):深入分析ConcurrentHashMap原文出处:方腾总本系列:聊聊并发(1)深入分析Volatile的实现原理聊聊并发(2)JavaSE1.6中的Synchronized聊聊并发(3)Java线程池的分析和使用术语定义术语英文解释哈希算法hashalgorithm是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。?哈希表hashtable根据设定的哈希函数H(key)和处理冲突方法将一组关键字映

2、象到一个有限的地址区间上,并以关键字在地址区间中的彖作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMapo如以下代码:finalIlashMap(2);Threadt=newThread(newRunnable(){©Overri

3、depublicvoidrun()for(inti=0;i<10000;i++){newThread(newRunnable(){©Overridepublicvoidrun(){map.put(UUTD.randomUUTD().toString(),〃〃},〃ftf〃+i)•start();}t.start();t.join();效率低下的HashTable容器?????HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一

4、个线程访问HashTable的同步方法吋,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态。如线程1使用put进行添加元索,线程2不但不能使用put方法添加元索,并且也不能使用get方法來获取元素,所以竞争越激烈效率越低。ConcurrentHashMap的锁分段技术?????HashTable容器在竞争激烈的并发环境下农现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其小一部分数据,那么当多线程访问容器里不同数据段的

5、数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程山用锁访问其中一个段数据的吋候,其他段的数据也能被其他线程访问。ConcurrentHashMap的结构我们通过ConcurrentHashMap的类图來分析ConcurrentHashMap的结构。ConcurrentHashMap是ftlSegment数组结构和HashEntry数组结构组成oSegment是一种nJ

6、重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构,一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素,每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。9■Concur

7、rentHashMap的初始化ConcurrentHashMap初始化方法是通过initialCapacity,loadFactor,concurrenc)^Level儿个参数来初始化segments数组,段偏移量segmentshift,段掩码segmentMask和每个segment里的HashEntry数组。初始化segments数组。让我们來看一下初始化segmentShift,segmentMask和segments数组的源代码。if(concurrencyLevel>MAXSEGMENTS)co

8、ncurrencyLevel=MAX_SEGMENTS;//Findpower-of-twosizesbestmatchingargumentsintsshift二0;intssize=1;while(ssize

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。