ConcurrentHashMap介绍

ConcurrentHashMap是线程安全的哈希表。
HashMap, Hashtable, ConcurrentHashMap之间的关联如下:

  1. HashMap是非线程安全的哈希表,常用于单线程程序中。
  2. Hashtable是线程安全的哈希表,它是通过synchronized来保证线程安全的;即,多线程通过同一个“对象的同步锁”来实现并发控制。Hashtable在线程竞争激烈时,效率比较低(此时建议使用ConcurrentHashMap)!因为当一个线程访问Hashtable的同步方法时,其它线程就访问Hashtable的同步方法时,可能会进入阻塞状态。
  3. ConcurrentHashMap是线程安全的哈希表,它是通过“锁分段”来保证线程安全的。ConcurrentHashMap将哈希表分成许多片段(Segment),每一个片段除了保存哈希表之外,本质上也是一个“可重入的互斥锁”(ReentrantLock)。多线程对同一个片段的访问,是互斥的;但是,对于不同片段的访问,却是可以同步进行的。

ConcurrentHashMap原理和数据结构

要想搞清ConcurrentHashMap,必须先弄清楚它的数据结构:

(01) ConcurrentHashMap继承于AbstractMap抽象类。

(02) Segment是ConcurrentHashMap中的内部类,它就是ConcurrentHashMap中的“锁分段”对应的存储结构。ConcurrentHashMap与Segment是组合关系,1个ConcurrentHashMap对象包含若干个Segment对象。在代码中,这表现为ConcurrentHashMap类中存在“Segment数组”成员。

(03) Segment类继承于ReentrantLock类,所以Segment本质上是一个可重入的互斥锁。

(04) HashEntry也是ConcurrentHashMap的内部类,是单向链表节点,存储着key-value键值对。Segment与HashEntry是组合关系,Segment类中存在“HashEntry数组”成员,“HashEntry数组”中的每个HashEntry就是一个单向链表。

对于多线程访问对一个“哈希表对象”竞争资源,Hashtable是通过一把锁来控制并发;而ConcurrentHashMap则是将哈希表分成许多片段,对于每一个片段分别通过一个互斥锁来控制并发。ConcurrentHashMap对并发的控制更加细腻,它也更加适应于高并发场景!

总结:ConcurrentHashMap是线程安全的哈希表,它是通过“锁分段”来实现的。ConcurrentHashMap中包括了“Segment(锁分段)数组”,每个Segment就是一个哈希表,而且也是可重入的互斥锁。第一,Segment是哈希表,表现在Segment包含了“HashEntry数组”,而“HashEntry数组”中的每一个HashEntry元素是一个单向链表。即Segment是通过链式哈希表。第二,Segment是可重入的互斥锁,表现在Segment继承于ReentrantLock,而ReentrantLock就是可重入的互斥锁。
对于ConcurrentHashMap的添加,删除操作,在操作开始前,线程都会获取Segment的互斥锁;操作完毕之后,才会释放。而对于读取操作,它是通过volatile去实现的,HashEntry数组是volatile类型的,而volatile能保证“即对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入”,即我们总能读到其它线程写入HashEntry之后的值。 以上这些方式,就是ConcurrentHashMap线程安全的实现原理。

出处:http://www.cnblogs.com/skywang12345/p/3498537.html

最新文章

  1. angularJS操作键值对象(类似java的hashmap)填坑小结
  2. 关于BigDecimal 和 double 类型保存金钱,以及精度问题,银行家舍入法
  3. 「iOS造轮子」之UIButton 用Block响应事件
  4. javascript对象初探(一)--- 构造器函数
  5. 【转】oracle job相关内容
  6. tomcat如何简单调优
  7. Hashtable与HashMap区别(2)
  8. JavaScript--函数-按值传递
  9. AES算法简介
  10. ubuntu 笔记
  11. Docker - 终端交互
  12. centos7 cannot find a valid baseurl for repo
  13. css3 transition属性实现3d动画效果
  14. 浅谈log4j-6-xml配置 转自godtrue
  15. day 27 网络通信协议 tup udp 下的socket
  16. Android Design Support Library(二)用NavigationView实现抽屉菜单界面
  17. javascript中setInterval制作跑马灯的效果
  18. 转:PHP中的使用curl发送请求(GET请求和POST请求)
  19. Java、MySQL - 前补0的方法
  20. php中的static

热门文章

  1. IP分类
  2. cf-789A (思维)
  3. 二分求LIS并打印结果
  4. python 小练习12
  5. 访问IIS元数据库失败的解决方法
  6. C语言按行读文件及字符串分割
  7. BZOJ1652 [Usaco2006 Feb]Treats for the Cows
  8. html frameset的介绍
  9. Python Django 之 MVT
  10. java 引用传递和值传递