侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 285 篇文章
  • 累计创建 125 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Java并发编程之concurrent包下的并发集合详解

孔子说JAVA
2022-07-02 / 0 评论 / 2 点赞 / 60 阅读 / 1,802 字 / 正在检测是否收录...

java提供两类适用于并发类的集合,一类是阻塞式集合,即当集合已满或为空时,被调用的添加或移除方法不能立即执行,此时这个线程阻塞,一直到该方法可以被成功执行。另一类为非阻塞式集合,即如果方法不能被立即执行,则返回null或抛出异常,使调用这个方法的线程不会被阻塞。java.util.concurrent 包里提供了很多并发类的集合,本教程主要介绍BlockingQueue(阻塞队列) 、ConcurrentHashMap(非阻塞队列)、ConcurrentNavigableMap(非阻塞队列)。

1、BlockingQueue

java.util.concurrent 包里的 BlockingQueue(阻塞队列) 接口是 Queue 接口的子接口,是一个在队列基础上又支持了两个附加操作的队列,常用来解耦。这两个附加的操作是:1)在队列为空时,获取元素的线程会等待队列变为非空。2)当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里获取元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。

  • 阻塞队列 BlockingQueue 通常用于一个线程生产对象,另外一个线程消费这些对象的场景。和其他类型队列的最重要的区别就是“阻塞”两个字。阻塞功能使得生产者和消费者两端的能力得以平衡,当有任何一端速度过快时,阻塞队列便会把过快的速度给降下来。实现阻塞最重要的两个方法是 take 方法和 put 方法。

  • 支持阻塞的插入方法put: 队列满时,队列会阻塞插入元素的线程,直到队列不满。

  • 支持阻塞的移除方法take: 队列空时,获取元素的线程会等待队列变为非空。

image-1656030281462

具体教程:Java并发编程之BlockingQueue阻塞队列原理及实战

2、ConcurrentHashMap

java.util.Map是使用最广泛的Java集合之一,其实现HashMap是线程不安全的,HashTable则是基于synchronized的线程安全(效率很低),另一个完全同步的Map是Collections.sychronizedMap,它也不是很高效。如果想要线程安全并且在高并发的情况下保持高吞吐量,就需要使用java.util.concurrent.ConcurrentMap,它是从java1.5开始新增的的Map实现。

  • ConcurrentMap继承了java.util.Map接口,是一个能够支持并发访问的集合接口,它提供了一种代码结构,用来指引解决数据读写时的线程安全问题。ConcurrentMap重写了Map中的很多default方法,用来实现线程安全和内存一致性的原子操作。很多的默认实现被重写,不允许使用null作为key/value。

具体教程:Java并发编程之ConcurrentHashMap原理及实战

3、ConcurrentNavigableMap

java.util.concurrent.ConcurrentNavigableMap接口是为了支持NavigableMap并发访问的而设计的子接口,使其子类可以实现并发访问。该接口继承自ConcurrentMap及NavigableMap接口,支持NavigableMap操作,并且递归地支持其可导航的子映射和近似匹配。既保证了线程安全性,又提供导航搜索子Map视图的功能。可以通过不同的方法,如 headMap(), subMap() 和tailMap(),返回这些子类。

image-1656549526204

  • java.util.concurrent.ConcurrentMap接口是Map接口的子接口,支持底层Map变量上的原子操作。 它具有获取和设置方法,如在变量上的读取和写入。 也就是说,一个集合与同一变量上的任何后续读取相关联。 该接口确保线程安全性和原子性保证。

  • NavigableMap 扩展了 SortedMap 接口,具有了针对给定搜索目标返回最接近匹配项的导航方法。

  • SortedMap(java.util.SortedMap)接口是Map的子接口,SortedMap中增加了元素的排序功能。可以使用Comparator的实现作为TreeMap 构造函数的参数 ,这个Comparator将用于对存储在SortedMap中的键、值对的键进行排序。

具体教程:Java并发编程之ConcurrentNavigableMap原理及实战

2

评论区