《实战 Java 高并发程序设计》笔记——第3章 JDK 并发包(三)

本文介绍了 Java 高并发编程中 JDK 提供的并发容器,包括 ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue 和 BlockingQueue。强调了这些线程安全的容器在多线程环境中的高效性和使用场景,如 ConcurrentHashMap 的并发优化,CopyOnWriteArrayList 的读多写少优势,以及 BlockingQueue 作为数据共享通道的作用。文章还探讨了并发容器的内部实现,如并发HashMap的线程安全包装和跳表(SkipList)的数据结构及其在并发查找中的优势。

声明:

本博客是本人在学习《实战 Java 高并发程序设计》后整理的笔记,旨在方便复习和回顾,并非用作商业用途。

本博客已标明出处,如有侵权请告知,马上删除。

3.3 不要重复发明轮子:JDK 的并发容器

除了提供诸如同步控制,线程池等基本工具外,为了提高开发人员的效率,JDK 还为大家准备了一大批好用的容器类,可以大大减少开发工作量。大家应该都听说过一种说法,所谓程序就是 “算法+数据结构”,这些容器类就是为大家准备好的线程数据结构。你可以在里面找到链表、HashMap、队列等。当然,它们都是线程安全的。

在这里,我也打算花一些篇幅为大家介绍一下这些工具类。这些容器类的封装都是非常完善并且 “平易近人” 的,也就是说只要你有那么一点点的编程经验,就可以非常容易地使用这些容器。因此,我可能会花更多的时间来分析这些工具的具体实现,希望起到抛砖引玉的作用。

3.3.1 超好用的工具类:并发集合简介

JDK 提供的这些容器大部分在 java.util.concurrent 包中。我先提纲挈领地介绍一下它们,初次露脸,大家只需要知道他们的作用即可。有关具体的实现和注意事项,在后面我会慢慢道来。

  • ConcurrentHashMap:这是一个高效的并发 HashMap。你可以理解为一个线程安全的 HashMap。
  • CopyOnWriteArrayList:这是一个 List,从名字看就是和 ArrayList 是一族的。在读多写少的场合,这个 List 的性能非常好,远远好于 Vector。
  • ConcurrentLinkedQueue:高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList。
  • BlockingQueue:这是一个接口,JDK 内部通过链表、数组等方式实现了这个接口。表示阻塞队列,非常适合用于作为数据共享的通道。
  • ConcurrentSkipListMap:跳表的实现。这是一个Map,使用跳表的数据结构进行快速查找。

除了以上并发包中的专有数据结构外,java.util 下的 Vector 是线程安全的(虽然性能和上述专用工具没得比),另外 Collections 工具类可以帮助我们将任意集合包装成线程安全的集合。

3.3.2 线程安全的 HashMap

在之前的章节中,已经给大家展示了在多线程环境中使用 HashMap 所带来的问题。那如果需要一个线程安全的 HashMap 应该怎么做呢

一种可行的方法是使用 Collections.synchronizedMap() 方法包装我们的 HashMap。如下代码,产生的 HashMap 就是线程安全的:

在这里插入图片描述

Collections.synchronizedMap() 会生成一个名为 SynchronizedMap的Map。它使用委托,将自己所有 Map 相关的功能交给传入的 HashMap 实现,而自己则主要负责保证线程安全。

具体参考下面的实现,首先 SynchronizedMap 内包装了一个 Map。

在这里插入图片描述

通过 mutex 实现对这个 m 的互斥操作。比如,对于 Map.get() 方法,它的实现如下:

在这里插入图片描述

而其他所有相关的 Map 操作都会使用这个 mutex 进行同步。从而实现线程安全。

这个包装的 Map 可以满足线程安全的要求。但是,它在多线程环境中的性能表现并不算太好。无论是对 Map 的读取或者写入,都需要获得 mutex 的锁,这会导致所有对 Map 的操作全部进入等待状态,直到 mutex 锁可用。如果并发级别不高,一般也够用。但是,在高并发环境中,我们也有必要寻求新的解决方案。

一个更加专业的并发 HashMap 是 ConcurrentHashMap。它位于 java.util.concurrent 包内。它专门为并发进行了性能优化,因此,更加适合多线程的场合

有关 ConcurrentHashMap 的具体实现细节,大家可以参考 “第4章 锁的优化及注意事项” 一章。我们将在那里给出更加详细的实现说明。

3.3.3 有关 List 的线程安全

队列、链表之类的数据结构也是极其常用的,几乎所有的应用程序都会与之相关。在 Java 中,ArrayList 和 Vector 都是使用数组作为其内部实现。两者最大的不同在于 Vector 是线程安全的,而 ArrayList 不是。此外,LinkedList 使用链表的数据结构实现了 List。但是很不幸,LinkedList 并不是线程安全的,不过参考前面对 HashMap 的包装,在这里我们也可以使用 Collections.synchronizedList() 方法来包装任意 List,如下所示:

在这里插入图片描述

此时生成的 List 对象就是线程安全的。

3.3.4 高效读写的队列:深度剖析 ConcurrentLinkedQueue

队列 Queue 也是常用的数据结构之一。在 JDK 中提供了一个 ConcurrentLinkedQueue 类用来实现高并发的队列。从名字可以看到,这个队列使用链表作为其数据结构。有关 ConcurrentLinkedQueue 的性能测试,大家可以自行尝试。这里限于篇幅就不再给出性能测试的代码。

[JAVA工程师必会知识点之并发编程]1、现在几乎100%的公司面试都必须面试并发编程,尤其是互联网公司,对于并发编程的要求更高,并发编程能力已经成为职场敲门砖。2、现在已经是移动互联和大数据时代,对于应用程序的性能、处理能力、处理时效性要求更高了,传统的串行化编程无法充分利用现有的服务器性能。3、并发编程是几乎所有框架的底层基础,掌握好并发编程更有利于我们学习各种框架。想要让自己的程序执行、接口响应、批处理效率更高,必须使用并发编程。4、并发编程是中高级程序员的标配,是拿高薪的必备条件。 【主讲讲师】尹洪亮Kevin:现任职某互联网公司首席架构师,负责系统架构、项目群管理、产品研发工作。10余年软件行业经验,具有数百个线上项目实战经验。擅长JAVA技术栈、高并发高可用伸缩式微服务架构、DevOps。主导研发的蜂巢微服务架构已经成功支撑数百个微服务稳定运行【推荐你学习这门课的理由:知识体系完整+丰富学习资料】1、 本课程总计122课时,由五大体系组成,目的是让你一次性搞定并发编程。分别是并发编程基础、进阶、精通篇、Disruptor高并发框架、RateLimiter高并发访问限流吗,BAT员工也在学。2、课程附带附带3个项目源码,几百个课程示例,5个高清PDF课件。3、本课程0基础入门,从进程、线程、JVM开始讲起,每一个节只专注于一个知识点,每个节均有代码实例。 【课程分为基础篇、进阶篇、高级篇】一、基础篇基础篇从进程与线程、内存、CPU时间片轮训讲起,包含线程的3种创建方法、可视化观察线程、join、sleep、yield、interrupt,Synchronized、重入锁、对象锁、类锁、wait、notify、线程上下文切换、守护线程、阻塞式安全队列等内容。二、进阶篇进阶篇课程涵盖volatied关键字、Actomic类、可见性、原子性、ThreadLocal、Unsafe底层、同步类容器、并发类容器、5种并发队列、COW容器、InheritableThreadLocal源码解析等内容。、精通篇精通篇课程涵盖JUC下的核心工具类,CountDownLath、CyclicBarrier、Phaser、Semaphore、Exchanger、ReentrantLock、ReentrantReadWriteLock、StampedLock、LockSupport、AQS底层、悲观锁、乐观锁、自旋锁、公平锁、非公平锁、排它锁、共享锁、重入锁、线程池、CachedThreadPool、FixedThreadPool、ScheduledThreadPool、SingleThreadExecutor、自定义线程池、ThreadFactory、线程池切面编程、线程池动态管理等内容,高并发设计模式,Future模式、Master Worker模式、CompletionService、ForkJoin等课程中还包含Disruptor高并发无锁框架讲解:Disruptor支持每秒600万订单处理的恐怖能力。深入到底层原理和开发模式,让你又懂又会用。高并发访问限流讲解:涵盖木桶算法、令牌桶算法、Google RateLimiter限流开发、Apache JMeter压力测试实战。 【学完后我将达到什么水平?】1、 吊打一切并发编程相关的笔试题、面试题。2、 重构自己并发编程的体系知识,不再谈并发色变。3、 精准掌握JAVA各种并发工具类、方法、关键字的原理和使用。4、 轻松上手写出更高效、更优雅的并发程序,在工作中能够提出更多的解决方案。  【面向人群】1、 总感觉并发编程很难、很复杂、不敢学习的人群。2、 准备跳槽、找工作、拿高薪的程序员。3、 希望提高自己的编程能力,开发出更高效、性能更强劲系统的人群。4、 想要快速、系统化、精准掌握并发编程的人群。【课程知识体系图】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bm1998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值