concurrent包下的并发容器

JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。

与Vector、HashTable、Collections.synchronizedXxx()等同步容器相比,util.concurrent中引入的并发容器主要解决了两个问题:

  1. 根据具体场景进行设计,尽量避免synchronized,提供并发性。
  2. 定义了一些并发安全的复合操作,并且保证并发环境下的迭代操作不会出错。

util.concurrent中容器在迭代时,可以不封装在synchronized中,可以保证不抛异常,但是未必每次看到的都是"最新的、当前的"数据。

下面是对并发容器的简单介绍:

ConcurrentHashMap代替同步的Map(Collections.synchronized(new HashMap())),众所周知,HashMap是根据散列值分段存储的,同步Map在同步的时候锁住了所有的段,而ConcurrentHashMap加锁的时候根据散列值锁住了散列值锁对应的那段,因此提高了并发性能。ConcurrentHashMap也增加了对常用复合操作的支持,比如"若没有则添加":putIfAbsent(),替换:replace()。这2个操作都是原子操作。

CopyOnWriteArrayList和CopyOnWriteArraySet分别代替List和Set,主要是在遍历操作为主的情况下来代替同步的List和同步的Set,这也就是上面所述的思路:迭代过程要保证不出错,除了加锁,另外一种方法就是"克隆"容器对象。

ConcurrentLinkedQueue是一个先进先出的队列。它是非阻塞队列。

ConcurrentSkipListMap可以在高效并发中替代SortedMap(例如用Collections.synchronizedMap包装的TreeMap)。

ConcurrentSkipListSet可以在高效并发中替代SortedSet(例如用Collections.synchronizedSet包装的TreeMap)。

为什么使用ConcurrentHashMap

线程不安全的HashMap

并发编程中使用HashMap可能导致程序死循环,导致cpu利用率接近100%。具体原因是,再执行put操作时会引起死循环,多线程会导致HashMap的Entry链表形成环形数据结构,这样的话Entry的next节点永远不为空,就会产生死循环获取Entry。

效率低下的HashTable

HashTable使用synchronized来保证线程安全,竞争激烈情况下,当一个线程访问同步方法,其他线程也访问同步方法,会进入阻塞或轮询状态。线程1使用put进行元素添加,线程2不但不能使用put方法,也不能使用get方法。

ConcurrentHashMap使用锁分段技术

ConcurrentHashMap将数据分成一段一段地存储,然后给每一段数据配一把锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持尽量的小,不用对整个ConcurrentHashMap加锁。当一个线程占用锁访问其中一个段数据的时候,其他段地数据也能被其他线程访问。

ConcurrentHashMap的结构

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

ConcurrentHashMap和HashTable的区别图

从上面的结构我们可以了解到,ConcurrentHashMap定位一个元素的过程需要进行两次Hash操作,第一次Hash定位到Segment,第二次Hash定位到元素所在的链表的头部,因此,这一种结构的带来的副作用是Hash的过程要比普通的HashMap要长,但是带来的好处是写操作的时候可以只对元素所在的Segment进行加锁即可,不会影响到其他的Segment,这样,在最理想的情况下,ConcurrentHashMap可以最高同时支持Segment数量大小的写操作(刚好这些写操作都非常平均地分布在所有的Segment上),所以,通过这一种结构,ConcurrentHashMap的并发能力可以大大的提高。

转载于:https://www.cnblogs.com/hesier/p/5929626.html

Java 并发---ConcurrentHashMap相关推荐

  1. Java 并发实践 — ConcurrentHashMap 与 CAS

    转载自 Java 并发实践 - ConcurrentHashMap 与 CAS 最近在做接口限流时涉及到了一个有意思问题,牵扯出了关于concurrentHashMap的一些用法,以及CAS的一些概念 ...

  2. Java 并发编程之 ConcurrentHashMap,ConcurrentSkipListMap

    Java并发容器Map类有两个,ConcurrentHashMap和ConcurrentSkipListMap,前者是无序的,后者有序. public class ConcurrentHashMapT ...

  3. java并发初探ConcurrentHashMap

    java并发初探ConcurrentHashMap Doug Lea在java并发上创造了不可磨灭的功劳,ConcurrentHashMap体现这位大师的非凡能力. 1.8中ConcurrentHas ...

  4. Java并发编程与技术内幕:ConcurrentHashMap源码解析

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了Java中ConcurrentHashMap 的源码 ConcurrentH ...

  5. 【转】Java并发编程:并发容器之ConcurrentHashMap

    JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...

  6. 【Java并发】-- ConcurrentHashMap如何实现高效地线程安全(jdk1.8)

    文章目录 1.传统集合框架并发编程中Map存在的问题? 2.早期改进策略 3.ConcurrentHashMap采取了哪些方法来提高并发表现(jdk1.8)? 4.ConcurrentHashMap实 ...

  7. Java并发编程71道面试题及答案

    Java并发编程71道面试题及答案 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方 ...

  8. Java并发编程73道面试题及答案——稳了

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户 ...

  9. Java并发编程题库

    文章目录 并发编程三要素? 实现可见性的方法有哪些? 创建线程的有哪些方式? 创建线程的三种方式的对比? Runnable 和 Callable 的区别 Java线程具有五中基本状态 什么是线程池?有 ...

最新文章

  1. oracle cusor游标,ORACLE CURSOR 游标详解
  2. Win7下JDK环境变量设置批处理(转)
  3. 计算机的c盘是硬盘吗,c盘是硬盘吗
  4. 网络延迟造成插入多条重复数据
  5. 看printk引发的一点思考
  6. IndexedDB基本概念
  7. GitHub 官方终于要出 App 了!手机上也能改Bug了...
  8. extjs中什么时候用{},什么时候用[]
  9. wps分析工具库如何加载_怎么在wps表格里面加入“数据分析”工具啊?
  10. java例程练习(数组复制与arraycopy)
  11. js实现下载 .txt文件
  12. Setup Factory 点击uninstall.exe Invalid start mode : archive filename
  13. Lvs之NAT、DR、TUN三种模式的应用配置案例
  14. html怎么把盒子做成超链接,把整个DIV变成超链接
  15. Android 设置铃声——给app设置自定义铃声功能
  16. 猎人打猎(一)-----简单的实现
  17. 计算机科学与技术毕业论文格式,计算机科学与技术毕业论文格式示例.docx
  18. linux/centos7 端口映射
  19. 工具 | Codeblock下载与安装及使用
  20. Mac如何利用qq提取图片上的文字

热门文章

  1. mlflow_使用MLflow跟踪进行超参数调整
  2. 京东连续亏损十几年,为什么却发展越来越大?
  3. VHDL中的左移函数
  4. 计算机1级 计算机基础知识,计算机一级计算机基础及MSOffice应用:计算机基础知识...
  5. 阿联酋esma认证_阿联酋无人驾驶汽车预计2021年上路
  6. python如何关闭窗口仍能运行_Python在退出时关闭自己的CMD shell窗口
  7. android 绕过root检测,公主连结怎么绕过root检测 绕过root检测方法一览
  8. java api管理工具_一个能快速写出实体类的Api文档管理工具
  9. MySQL查询之聚合查询
  10. Linux 防火墙:Netfilter iptables