ICode9

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

java 并发容器

2022-01-19 22:33:07  阅读:94  来源: 互联网

标签:容器 同步 java 实现 阻塞 并发 线程


1.什么是同步容器

  Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的

  如果有多个线程并发地访问这些容器时,就会出现问题。因此,在编写程序时,在多线程环境下必须要求程序员手动地在任何访问到这些容器的地方进行同步处理,这样导致在使用这些容器的时候非常地不方便

  所以,Java先提供了同步容器供用户使用

  同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector、Hashtable以及SynchronizedList等容器

2.同步容器,主要的分类

  •  Vector
  •  Stack
  •  HashTable
  •  Collections.synchronized方法生成

2.1同步容器面临的问题

  可以通过查看Vector,Hashtable等这些同步容器的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来并在需要同步的方法上加上关键字synchronized

  这样做的代价是削弱了并发性,当多个线程共同竞争容器级的锁时,吞吐量就会降低

  例如: HashTable只要有一条线程获取了容器的锁之后,其他所有的线程访问同步函数都会被阻塞,因此同一时刻只能有一条线程访问同步函数

  因此为了解决同步容器的性能问题,所以才有了并发容器

3.什么是并发容器

  java.util.concurrent包中提供了多种并发类容器

  并发类容器是专门针对多线程并发设计的,使用了锁分段技术,只对操作的位置进行同步操作,但是其他没有操作的位置其他线程仍然可以访问,提高了程序的吞吐量

  采用了CAS算法和部分代码使用synchronized锁保证线程安全

4.并发容器有哪些分类

  1.ConcurrentHashMap

    对应的非并发容器:HashMap

    目标:代替Hashtable、synchronizedMap,支持复合操作

    原理:JDK6中采用一种更加细粒度的加锁机制Segment“分段锁”,JDK8中采用CAS无锁算法

  2.CopyOnWriteArrayList

    对应的非并发容器:ArrayList

    目标:代替Vector、synchronizedList

    原理:利用高并发往往是读多写少的特性,对读操作不加锁,对写操作,先复制一份新的集合,在新的集合上面修改,然后将新集合赋值给旧的引用,并通过volatile 保证其可见性,当然写操作的锁是必不可少的了

  3.CopyOnWriteArraySet

    对应的非并发容器:HashSet

    目标:代替synchronizedSet

    原理:基于CopyOnWriteArrayList实现,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent方法,其遍历当前Object数组,如Object数组中已有了当前元素,则直接返回,如果没有则放入Object数组的尾部,并返回

  4.ConcurrentSkipListMap

    对应的非并发容器:TreeMap

    目标:代替synchronizedSortedMap(TreeMap)

    原理:Skip list(跳表)是一种可以代替平衡树的数据结构,默认是按照Key值升序的

  5.ConcurrentSkipListSet

    对应的非并发容器:TreeSet

    目标:代替synchronizedSortedSet

    原理:内部基于ConcurrentSkipListMap实现

  6.ConcurrentLinkedQueue

    不会阻塞的队列

    对应的非并发容器:Queue

    原理:基于链表实现的FIFO队列(LinkedList的并发版本)

  7.LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue

    对应的非并发容器:BlockingQueue

    特点:拓展了Queue,增加了可阻塞的插入和获取等操作

    原理:通过ReentrantLock实现线程安全,通过Condition实现阻塞和唤醒

    实现类:   

         LinkedBlockingQueue:基于链表实现的可阻塞的FIFO队列

            ArrayBlockingQueue:基于数组实现的可阻塞的FIFO队列

            PriorityBlockingQueue:按优先级排序的队列

 

标签:容器,同步,java,实现,阻塞,并发,线程
来源: https://www.cnblogs.com/hzzjj/p/15824439.html

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

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

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

ICode9版权所有