Java高并发与集合框架:JCF和JUC源码分析与实现!

前言

笔者一直在信息系统建设的一线工作,承担过多种不同的工作职责。在 工作中,笔者经常和掌握不同技术的朋友讨论具体问题的解决方案,发现在 Java体系中,大家使用最多的是Java集合框架(JCF)和Java并发工具包 (JUC)。实际上,JCF和JUC已经能够覆盖笔者及朋友们工作中遇到的超过8 成的应用场景,但是大家往往无法快速匹配最合适的技术方案。此外,在JCF 和JUC中存在大量可以在实际工作中借鉴的设计方案,虽然网络上有一些零散 的关于集合的介绍,但深入讲解其工作原理的内容并不多,甚至有一些资料 存在质量问题。
笔者“撸码”近17年,庆幸头未秃、智未衰。于是笔者在1年前产生了这 样的想法,希望将自己在实际工作中梳理、总结的JCF、JUC的相关知识成体 系地介绍给大家,也希望将自己在阅读JDK源码(包括JCF、JUC、I/O、NET等 模块)后总结和思考的可用于实际工作的技术手段成体系地分享给大家。
有了想法,便着手行动,经过大半年的整理、撰写、调整,终成本书。
由于JDK版本迭代速度较快,本书的整理和撰写又需要一个较长的时间, 并且书中内容包括大量源码分析和讲解,因此本书首先要解决的问题,就是 选定一个本书进行源码讲解和分析所依据的JDK版本。
这个问题需要从JDK版本的更新特点、大家使用JDK版本的习惯和撰写本 书的目的来考虑,目前大家在实际工作中使用最多的版本是JDK 1.8和JDK 11,并且出于对Oracle商业运作的考虑,JDK 11之后的升级版本已不再免费 提供,因此大家在生产环境中一般使用Open JDK作为运行环境。同样出于对 Oracle商业运作的考虑,JDK版本的发布周期固定为每半年发布一个大版本、 每3年发布一个LTS/LMS版本(长期支持版本),截至2021年4月,JDK 16已经 发布(JDK 16是一个短期过渡版本),紧接着2021年9月,JDK 17正式发布 (这是一个LTS/LMS版本),这显然加大了读者学习和筛选JDK版本的工作 量。
好消息是Oracle基本开源了所有已成熟的JDK版本,是否商业化运行并不 会影响我们对这些JDK源码的学习(只要不用于商业用途),而且JDK版本的 向下兼容性保证了读者在了解JDK的工作原理后,可以将其应用到自己正在使 用的JDK版本上。此外,越新的JDK版本对关键数据结构、关键算法实现过程 的优化越多,本书希望在讲解过程中,可以尽可能多地将这些有益的优化点 介绍给读者。
在综合考虑各因素后,本书将JDK 14作为本书讲解源码依据的主要版本 (在后续内容中,如果不特别说明,那么代码分析都是基于JDK 14进行 的)。JDK 14是在整理、编写本书时发布的版本。在该版本中,与本书主要 内容有关的数据结构、核心算法、设计方案和之前的版本基本保持稳定和兼 容,便于读者在常用的JDK 1.8、JDK 11中找到对应的实现位置。本书介绍的 JDK 14中的源码内容是完全开源的,读者可以在Oracle官方网站直接下载这 些源码。

讲解目录

讲解内容

第一部分 Java集合框架,

Java集合框架(Java Collection Framework,JCF)是Java标准平台 (J2SE)的重要组成部分,也是Java程序员必须掌握的关键知识。从Java诞 生之初,Java集合框架就一直在改进、演化。目前,如果根据操作特性划分 Java集合框架,则可以将其分成四大部分:List集合(线性集合)、Set集合 (去重集合)、Queue集合(队列集合)和Map集合(K-V键值对集合);如果 根据工作场景特性划分Java集合框架,则可以将其分成支持高并发场景的集 合和不支持高并发场景的集合;如果根据提供者划分Java集合框架,则可以 将其分成原生集合和由第三方组织提供的集合,如图I-1所示。

List集合:此类集合的基本特点是,集合内部使用一种线性表结构进 行数据的实际存储,程序员可以按照指定的数据存入顺序获取数据,也可以 按照需要操作集合的任意有效位置执行数据的存取操作。
• Set集合:此类集合的基本特点是,通过某种特定的规则,对集合内部 的数据进行去重。此外,此类集合使用的是根据一定的内置规则确定的数据 存储顺序,不一定使用程序员将数据存入集合的先后顺序。
• Queue集合:此类集合的基本特点是,程序员可以按照数据在集合中先 入先出(FIFO)的顺序或先入后出(FILO)的顺序,从集合头部或集合尾部 进行数据读/写操作。
• Map集合:此类集合主要用于读/写K-V键值对形式的数据,并且数据的 Key键信息在此类集合中不允许有重复。具体的集合实现可以根据适用场景自 行决定是否向程序员提供按照数据写入顺序进行数据读取的工作特性。 除了由Java标准平台(J2SE)提供丰富的、可覆盖大部分使用场景的
原生集合外,大量第三方组织也遵循(或部分遵循)Java容器框架的设计规 范,提供了大量集合供自身功能或程序员使用。例如,Google Guava工具包 提 供 了 多 种 高 性 能 集 合 实 现 , 如 ImmutableList 、 ImmutableSet 、 ImmutableMap等。
Java原生提供的各类集合,其性能虽然不是最优秀的,但这些集合的内 部设计思想值得程序员借鉴到自己的日常工作中。该部分内容会为读者介绍 Java原生的基本集合功能,对这些集合的内部工作原理进行剖析。

第1章JCF中的List集合


第2章JCF中的Queue、 Deque集合

第3章 JCF中的Map集合

第4章 JCF的Set集合

第二部分 JUC与高并发概述

在第Ⅰ部分介绍的JCF相关知识中,所有实现Set、Map、List、Queue接 口的集合都不推荐在高并发场景中使用,虽然有一些已介绍的集合使用 synchronized修饰符或java.util.Collections工具类中的线程安全性封装进 行了处理,但这些集合同样不适合在高并发场景中使用。Java推荐在高并发
场景中使用JUC(java.util.concurrent,Java并发工具包)进行编程,并且 使用JUC提供的集合在高并发场景中工作。
要了解JUC和JCF之间的关联,首先需要对JUC进行介绍。JUC是一个较为 庞大的知识话题,Doug Lea的著作Concurrent Programming in Java对JUC的 核心设计思想进行了详尽描述。限于本书的篇幅和主旨,本书只选取JUC中与 集合工作有关的知识点进行介绍(实际上这些知识点已经足够读者了解JUC的 设计思想)。
首先需要回答一个问题:在高并发场景中,应用程序主要需要考虑哪些 问题?
1. 线程安全性的三性
1)内存可见性。
内存可见性问题是由Java内存模型(JMM)引起的问题,在Java内存模型 中,每一个线程都有自己的工作内存区,工作内存区相对独立,其中的值为主内存区中值的副本,概要结构如图II-1所示。

第5章 Object Monitor管程实现


第6章 JUC的必要组成部分


第7章另一种管程实现一AQS技术


第三部分 在高并发场景中工作的集合

在高并发场景中工作的集合,实际上是由JUC提供的一个功能维度。高并 发场景中的集合,其优先关注的问题通常不是集合的整体性能,而是工作的 稳定性和在特定场景中的高性能。如果读者的业务源码中不存在多个线程同 时操作同一个集合的场景,那么不需要使用这些由JUC提供的集合。如下源码 场景就是一个不推荐使用线程安全集合的典型场景。
ConcurrentSkipListSet集合是一种存在于JUC中,基于跳跃表结构的线 程安全的Set集合。在上述源码中,变量mySet引用的对象是resolve()方法的 局部变量,根据JVM的内存结构(特别是栈结构)可知,这种局部变量只要没 有被全局变量引用,就不存在线程安全性问题。所以在上述源码中,建议直 接使用类似于TreeSet的集合,而不是类似于ConcurrentSkipListSet的集 合。

第8章 高并发场景中的List、Map和Set集合


第9章 高并发场景中的Queue集合


第10章 高并发场景中的集合总结

因为包含的内容比较多,小编只做了简单的章节截图介绍,每个章节都有更加细化的内容!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值