前言

在编程行业中,有一个东西是和广大程序员形影不离的,在最一开始接触编程就是配置它的运行环境,然后java / javac,对,这个东西就是jdk

昨天项目刚上线,可以稍微休息一下了,但是猛的闲下来,反而有点不适应,想整点什么东西,想起之前看到的一条消息,jdk15要发布了,不得不感慨信息化产业发展的速度,但是,没关系,不慌张,他强任他强,我用Java8,没办法,oracle jdk的收费政策也让生产商更加坚定的选择Java8,但是,虽然你天天在用,但是你真的了解Java8吗?比如我们经常说的线程与并发

今天,我们就来看一下,在源码层级的线程与并发是如何进行的,这也是面试过程中的一个重点

正言

对于线程和 进程,我理解的就是汽车和高速公路

但是对于人脑的认知来说,“代码一行行串行”当然最容易理解。但在多线程下,多个线程的代码交叉并行,要访问互斥资源,要互相通信。作为开发者,需要仔细设计线程之间的互斥与同步,稍不留心,就会写出非线程安全的代码。正因此,多线程编程一直是一个被广泛而深入讨论的领域。

在JDK1.5发布之前,Java只在语言级别上提供一些简单的线程互斥与同步机制,也就是synchronized关键字、wait 与notify。如果遇到复杂的多线程编程场景,就需要开发者基于这些简单的机制解决复杂的线程同步问题。而从JDK 1. 5开始,并发编程大师Doug Lea奉上了一个系统而全面的并发编程框架一一JDKConcurrent包,里面包含了1各种原子操作、线程安全的容器、线程池和异步编程等内容。

本书基于JDK7和JDK8,对整个Concurrent包进行全面的源码剖析。JDK8中大部分并发功能的实现和JDK7一样,但新增了一些额外特性。例如CompletableFuture、ConcurrentHashMap的新实现、StampedLock、LongAdder等。

对整个Concurrent包的源码进行分析,有以下几个目的:

(1)帮助使用者合理地选择解决方案。Concurrent包很庞大,有各式各样的线程互斥与同步机制。明白实现原理,使用者可以根据自己的业务场景,选择最适合自己的解决方案。避免重复造轮子,也避免因为使用不当而掉到“坑”里。

(2)对源码的分析,将让使用者对内存屏障、CAS原子操作、锁、无锁等底层原理的认识,不再停留于一个“似是而非”的阶段,而是深刻地认识其本质。

(3)吸收借鉴大师的思维。在Concurrent 包中,可以看到各种巧妙的并发处理策略。看了Concurrent包,才会发现在多线程中,不是只有简陋的互斥锁、通知机制和线程池。

因为涉及内容比较多,这里就不一一展现了,我整理成了一份文档以及一份知识图谱

目  录

多线程基础

1.1线程的优雅关闭

1.2 InterruptedException ()函数与interrupt ()函数

1.3 synchronized关键字

1.4wait ()与notify ()

1.5 volatile关键字

1.6 JMM与happen-before

1.7内存屏障

1.8 final关键字

1.9综合应用:无锁编程

atomic类

2.1 AtomiclInteger和AtomicLong

2.2 AtomicBoolean和AtomicReference

2.3 AtomicStampedReference和AtomicMarkableReference

2.4 AtomicIntegerFieldUpdaterAtomicLongFieldUpdater和AtomicReferenceFieldUpdater

2.5 AtomicIntegerArray、AtomicLongArray和Atomic-ReferenceArray

Lock与Condition

3.1互斥锁

3.2读写锁

3.3 Condition

3.4 StampedLock

同步工具类

4.1 Semaphore

4.2 CountDownl atch

4.3 CyclicBarrier

4.4 Exchanger

4.5 Phaser

并发容器

5.1 BlockingQueue

5.2 BlockingDeque

5.3 CopyOnWrite

5.4 ConcurrentLinkedQueue/Deque

5.5 ConcurrentHashMap

5.6 ConcurrentSkipListMap/Set

线程池与Future

6.1线程池的实现原理

6.2线程池的类继承体系

6.3 ThreadPoolExector

6.4 Callable与Future

6.5 ScheduledThreadPoolExecutor

6.6 Executors工具类

ForkJoinPool

7.1 ForkJoinPool用法

7.2核心数据结构

7.3工作窃取队列

7.4 ForkJoinPool状态控制

7.5 Worker线程的阻塞唤醒机制

7.6任务的提交过程分析

7.7工作窃取算法:任务的执行过程分析

7.8 ForkJoinTask的fork/join

7.9 ForkJoinPool的优雅关闭

CompletableFuture

8.1 CompletableFuture用法

8.2四种任务原型

8.3 CompletionStage接口

8.4 CompletableFuture内部原理

8.5任务的网状执行:有向无环图

8.6 allOf内部的计算图分析

内容展示

第1章多线程基础

第2章Atomic类

第3章Lock与Condition

第4章同步工具类

除了锁与Condition,Concurrent 包还提供了一系列同步工具类。这些同步工具类的原理,有些也是基于AQS的,有些则需要特殊的实现机制,这一章将对所有同步工具类的实现原理进行剖析。

第5章并发容器

第6章线程池与Future

线程池和Future我想不需要做过多的介绍,尤其是线程池,无论是面试还是工作,都是一个很重要的知识点

第7章ForkJoinPool

ForkJoinPool就是JDK7提供的一种“分治算法”的多线程并行计算框架。Fork意为分叉,Join意为合并,一分一合,相互配合,形成分治算法。此外,也可以将ForkJoinPool看作一个单机版的Map/Reduce,只不过这里的并行不是多台机器并行计算,而是多个线程并行计算。

第8章CompletableFuture

在探讨Completabl eFuture的原理之前,先详细看一下CompletableFuture的用法,从这些用法中,可以看到相较之前的Future有哪些能力得到了提升。


而根据这份文档,我也整理形成一张知识导图,不过还在完善中,给大家展示一下

这份思维导图也分享给大家,大家可以根据自己的情况去有针对性的补充,同样的,

相应的文档跟学习视频已经准备好了,结合文档一起学习,事半功倍,为了大家能够更好的面试,添加小助手:msbxq2020免费获取

关注公众号:Java架构师联盟,每日更新技术好文

部分资料已经上传到我的git仓库中:有需要的可以下载

https://gitee.com/biwangsheng/mxq

GitHub标星120K+的JDK并发编程指南,连续霸榜GitHub终于开源了的更多相关文章

  1. 5.7w字?GitHub标星120K的Java面试知识点总结,真就物超所值了

    如果你觉得在一些程序员平台获取到的资料太乱学习起来毫无头绪,但是单看<Java编程思想>相似的一类的Java圣经"枯燥无味",那我推荐你看一下这份GitHub获得过12 ...

  2. github标星11600+机器学习课程资源

    github标星11600+:最全的吴恩达机器学习课程资源(完整笔记.视频.python作业) 吴恩达老师的机器学习课程,可以说是机器学习入门的第一课和最热门课程,我在github开源了吴恩达机器学习 ...

  3. GitHub 标星 2.4w+,最适合编程新手入门的宝藏项目推荐

      照惯例这周给大家推荐几个Github上高星的优秀项目,我的github:图灵的猫 ,也欢迎大家follow~ 下面这是第一个,也是首推的新手入门项目,以前我入门的时候如果有这样一个项目,知识广度和 ...

  4. Github标星过万,Python新手100天学习计划。

    大数据文摘编辑部出品 作为目前最火也是最实用的编程语言,Python不仅是新手入门程序界的首选,也逐渐成为了从大厂到小厂,招牌需求list的必要一条. 当然,学Python这件事情,你可能也和文摘菌一 ...

  5. Github标星过万,Python新手100天学习计划,这次再学不会算我输!

      作为目前最火也是最实用的编程语言,Python不仅是新手入门程序界的首选,也逐渐成为了从大厂到小厂,招牌需求list的必要一条. 当然,学Python这件事情,你可能也和文摘菌一样,已经下了一百次 ...

  6. Github标星4W+,热榜第一,如何用Python实现所有算法

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 大数据文摘(BigDataDigest) 编译 | 周素云.蒋宝尚 学会了 Python 基 ...

  7. 12306 抢票项目霸榜 GitHub,标星即将破万

    十一将至,你买到回家的火车票了吗?如果没有,你可以试着打开 GitHub,在搜索栏键入 12306 的关键词,我相信你会发现一个新大陆.没错,这里有 1572 个抢票项目.它们大多用 Python.J ...

  8. GitHub标星2.6万!Python算法新手入门大全

    今天推荐一个Python学习的干货. 几个印度小哥,在GitHub上建了一个各种Python算法的新手入门大全,现在标星已经超过2.6万.这个项目主要包括两部分内容:一是各种算法的基本原理讲解,二是各 ...

  9. Github标星26k+!一个神奇的软件!1分钟即可打造了一个科幻风格的终端

    Github掘金计划项目分类汇总(原创不易,若有帮助,欢迎分享/点赞): 编程基础 :精选编程基础如学习路线.编程语言相关的开源项目. 计算机基础:精选计算机基础(操作系统.计算机网络.算法.数据结构 ...

随机推荐

  1. flask下直接展示mysql数据库 字段

    在工作中,会导出一份mysql的html来查看,用的是就是路过秋天大神的那个工具,所以想自己用那个样式直接在后端写一个页面做展示! 前端页面 from flask import Flask,reque ...

  2. class初探

    我们说类的时候,先回忆一下es5的构造函数 function myobj(x,y){ this.x= x; this.y =y; } myobj.prototype.add = function(){ ...

  3. django-模板之标签

    目录 模板 模版是纯文本文件,可以生成任何基于文本的文件格式,比如HTML,XML,CSV等.Django模版语言致力于在性能和简单性上取得平衡.Django的模版系统并不是简单的将Python嵌入到 ...

  4. MySQL之外键、联合查询、子查询

    外键(foreign key): 外面的键(键不在自己表中),如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称之为外键. 外键可以在创建表的时候或者创建表之后增加(但是要考虑数据的 ...

  5. PHP中interface的用处

    确实,PHP 接口是有它的目的的.   它们是契约,是给其他开发人员的说明手册.然而,还是很难理解接口有什么用.   基础 接口是抽象的类,无法直接实例化,但是可被实现.   这是一个基本的例 int ...

  6. js控制语句练习(回顾)

    1.一个小球从100米空中落下,每次反弹一半高度,小球总共经过多少米,请问第10次反弹的高度是多少? //定义初始下落过程高度 var sum1= 0; //定义初始上升高度 var sum2= 0; ...

  7. stringsream用法

    stringstream: 头文件: #include <sstream> 简单整理一下这玩意的作用,主要有三个吧. 类型转化 字符串拼接 字符串整合(这一个用处特别大!!!!!!!) 先 ...

  8. Python修改元组

    Python修改元组:元组中的元素值是不允许修改的,当创建好的时候就是固定不变的.所谓的修改其实是指创建一个新的元组,只是该元组可能是比原来的元组多一个元素或者少一个元素,然后使用新创建好的元组代替原 ...

  9. Python第一次实验

    ''' 计算 1.输入半径,输出面积和周长 2.输入面积,输出半径及周长 3.输入周长,输出半径及面积 ''' # # 1.输入半径,输出面积和周长 # from math import pi # # ...

  10. Python exec 内置语句

    描述 exec 执行储存在字符串或文件中的Python语句,相比于 eval,exec可以执行更复杂的 Python 代码.岭组词  https://www.cgewang.com/post/2205 ...