写在前面

最近想根据自己平时的工作笔记和学习笔记,整理出一些JAVA专题类的系列文章。平时自己的笔记比较散,趁着这个机会进行系统化的整合一下,同时看到网上能形成体系化的知识点比较少,所以也趁着这个机会,整理、归纳、分享一下给大家。

专题的内容主要采用对话的形式,一个是学习热情高涨,爱好提问的小陈;一个是知识储备丰厚,工作多年且经验丰富的老王;文章的知识讲解主要是通过两人的对话展开。

工作以来和同事交谈过不少,也面试过不少人;但是感觉对于JAVA并发这块的整体知识,很难有人能形成一个比较完整的体系和脉络,比如JAVA并发工具类体系、线程池体系、AtomicInteger体系、Synchronized、volatile底层、内存模型等,很多兄弟都只是了解其中的某个点。

所以我根据之前自己对JAVA并发底层原理的学习、以及之前源码分析的笔记、流程图等,整理出一套比较完善的学习笔记,希望能对你学习并发有所帮助。

专题文章内容

我的笔记中对JAVA并发的学习路线按照修炼层次划分了几个阶段哈,分别为:筑基、炼气、结丹、金丹、元神、飞升等六大阶段哈,从最开始慢慢打好基础,然后逐步修炼,最终成为高手。嘿嘿,我废话不多说了,看一下下面的阶段内容介绍哈:

筑基

最开始的阶段当然是打好基础啦,所以啊我会从多核CPU多级缓存架构、JAVA内存模型、并发的可见性、有序性、原子性、MESI一致性等开始分析底层原理,以及带来了并发安全的什么问题?等先讲解和介绍一些基础的概念,这个阶段就是打基础用的。

练气

有了基础的概念之后,再来分析什么是volatile?什么是内存屏障?内存屏障怎么解决可见性和有序性的问题,以及volatile是怎么使用内存屏障的?

带你来分析一下Synchronized的底层原理是怎么样的?什么是对象头,对象头里面有什么信息?怎么通过对象头和Synchronized进行关联的?synchronized是怎么是加锁的?怎么保证并发安全的?怎么进行锁升级和优化的?

学好了这个阶段,相当在基础之上,并发的一些理解和功力慢慢变得深厚了。

结丹

有了上面筑基、练气的修炼之后,并发的功力慢慢变得深厚,随着修为的提升,进入并发的结丹境界。

在这个阶段会重点介绍JDK底层的unsafe类提供操作系统底层的功能,包括从内存级别CAS操作数据、从操作系统级别分配和释放内存、从操作系统级别阻塞和唤醒线程等功能。

还会从底层源码、实现机制讲解Atomic体系中非常常用的原子类,包括:AtomicInteger、AtomicBoolean是怎么通过volatile和cas机制实现的?从源码级别去分析同时画图理解。

介绍AtomicInteger、AtomicBoolean等简单原子类的缺点,存在ABA问题、高并发竞争导致大量线程自旋问题、无法做到多个变量同时更新的原子性问题等

然后讲解AtomicReference 是怎么解决多变量更新的原子性问题的?AtomicStampReference怎么解决ABA问题的?LongAdder怎么使用分段解决高并发导致大量线程自旋问题的?等等....

学到这里,恭喜你,CAS操作的底层原理,Atomic体系的原子类底层的实现原理,你都一一了解了,并发修行进入了结丹境界,哈哈。

金丹

有了上面筑基、练气的底层知识基础,通过CAS底层原理、Atomic体系剖析进入结丹境界之后,下一阶段的修行就会非常重要了,那就是金丹期。在这个阶段我们会介绍JUC提供的JAVA并发工具的底层原理。

包括JAVA并发的核心AQS是个什么东西?AQS作为底层的一个并发框架到底实现了什么功能和机制,才能作为并发框架?

基于AQS实现的各种各样的并发工具ReentrantLock、CountDownLatch、Semaphore、ReentrantReadWriteLock等等,它们是怎么基于AQS来实现各种各样的功能的?上面的东西我们都会一个一个的进行源码级别的剖析、画图讲解。

学完了这一章节之后,JAVA并发工具的实现机制和底层原理对你来说已经不成问题了,你的并发功力也是十分深厚了,这一篇并发工具的底层原理是很多修炼者的瓶颈,学完这一章,直接让你的并发功力大增。

元神

学完了上面的篇章,并发功力大增之后;我们逐步开始修炼元神。

这一篇会讲解JUC中非常重要的一些并发安全的数据结构、包括CopyOnWriteArrayList底层是怎么是实现的,怎么通过写时复制提升并发性能?

ConcurrentLinkedQueue是怎么通过CAS无锁化操作提升并发性能的?

最经常讨论的ConcurrentHashMap是怎么通过分段锁机制提升并发性能的?

ArrayBlockedQueue、LinkedBlockedQueue等是怎么基于之前的ReentrantLock锁 + Condition机制实现阻塞唤醒的?

DelayQueue、SynchronousQueue等其它阻塞队列的剖析等

学完这一章节,相信你对JAVA并发的理解变得更加深入了,怎么通过之前的锁、CAS、volatile、synchronized等知识实现我们功能,这些并发安全的数据结构怎么通过之前的知识设计出来的?如果我们要实现并发安全的系统设计应该怎么做?到了这一阶段,好好学习,肯定会对你并发的设用和设计能力提升一大截。

飞升

修炼完上面的境界,相信你的JAVA并发的功力已经非常深厚,这个时候就能进入飞升境界了。

这一篇我们看看线程池底层是怎么设计和实现的?看看一些非常牛逼的人,是怎么运用并发知识设计出线程池这么一个牛逼的东西的?

包括线程池构造函数、每个参数的深入分析,每个参数是什么意思?一个32位的变量怎么使用不同的二进制位表示线程池数量和线程池状态的,对状态和数量的操控对应哪些方法?

往线程池提交任务的整体流程源码是怎么样的?

线程数量未达到核心数量时提交任务会怎么样?

达到核心数量会怎么样?阻塞队列满了会怎么样?线程数量达到最大数量会怎么样?

有哪些拒绝策略,怎么触发线程拒绝策略?

线程池中的Worker(工作者)的概念是什么?

当线程数量大于核心线程数的时候,怎么通过线程最大存活时间移除多余的线程的?

看看为啥不推荐使用Executors提供的创建线程池方式?

这一篇我们主要是来分析一下线程池底层实现原理是什么?看看顶尖的大佬是怎么设计出这么牛逼的线程池的?这一篇对你线程池原理的理解大有帮助,同时借鉴人家的设计思路,如果让你来实现可以做到吗?学完这一片相信你对JAVA并发的整体运用和理解能更加深入,设计思路和能力也很有帮助

最后,加油,修炼无止尽,继续努力,继续进步,祝各位道友修炼有得、不断进步。

关注小陈,公众号上更新更多的java并发文章

JAVA并发文章目录(公众号)

JAVA并发专题 《筑基篇》

1.什么是CPU多级缓存模型?

2.什么是JAVA内存模型?

3.线程安全之可见性、有序性、原子性是什么?

4.什么是MESI缓存一致性协议?怎么解决并发的可见性问题?

JAVA并发专题《练气篇》

5.volatile怎么保证可见性?

6.什么是内存屏障?具有什么作用?

7.volatile怎么通过内存屏障保证可见性和有序性?

8.volatile为啥不能保证原子性?

9.synchronized 是个啥东西?应该怎

9.synchronized 是个啥东西?应该怎么使用?

10.synchronized底层之monitor、对象头、Mark Word?

11.synchronized底层是怎么通过monitor进行加锁的?

12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁

13.synchronized怎么保证可见性、有序性、原子性?

JAVA并发专题《结丹篇》

14. JDK底层Unsafe类是个啥东西?

15.unsafe类的CAS是怎么保证原子性的?

16.Atomic原子类体系讲解

17.AtomicInteger、AtomicBoolean的底层原理

18.AtomicReference、AtomicStampReference底层原理

19.Atomic中的LongAdder底层原理之分段锁机制

20.Atmoic系列Strimped64分段锁底层实现源码剖析

JAVA并发专题《金丹篇》

21.AQS是个啥?为啥说它是JAVA并发工具基础框架?

22.基于AQS的互斥锁底层源码深度剖析

23.基于AQS的共享锁底层源码深度剖析

24.ReentrantLock是怎么基于AQS实现独占锁的?

25.ReentrantLock的Condition机制底层源码剖析

26.CountDownLatch 门栓底层源码和实现机制深度剖析

27.CyclicBarrier 栅栏底层源码和实现机制深度剖析

28.Semaphore 信号量底层源码和实现机深度剖析

28.ReentrantReadWriteLock 读写锁怎么表示?

29. ReentrantReadWriteLock 读写锁底层源码和机制深度剖析

JAVA并发专题《元神篇》并发数据结构篇

30.CopyOnAarrayList 底层分析,怎么通过写时复制副本,提升并发性能?

31.ConcurrentLinkedQueue 底层分析,CAS 无锁化操作提升并发性能?

32.ConcurrentHashMap详解,底层怎么通过分段锁提升并发性能?

33.LinkedBlockedQueue 阻塞队列怎么通过ReentrantLock和Condition实现?

34.ArrayBlockedQueued 阻塞队列实现思路竟然和LinkedBlockedQueue一样?

35.DelayQueue 底层源码剖析,延时队列怎么实现?

36.SynchronousQueue底层原理解析

JAVA并发专题《飞升篇》线程池底层深度剖析

37. 什么是线程池?看看JDK提供了哪些默认的线程池?底层竟然都是基于ThreadPoolExecutor的?

38.ThreadPoolExecutor 构造函数有哪些参数?这些参数分别表示什么意思?

39.内部有哪些变量,怎么表示线程池状态和线程数,看看道格.李大神是怎么设计的?

40. ThreadPoolExecutor execute执行流程?怎么进行任务提交的?addWorker方法干了啥?什么是workder?

41. ThreadPoolExecutor execute执行流程?何时将任务提交到阻塞队列? 阻塞队列满会发生什么?

42. ThreadPoolExecutor 中的Worker是如何执行提交到线程池的任务的?多余Worker怎么在超出空闲时间后被干掉的?

43. ThreadPoolExecutor shutdown、shutdownNow内部核心流程

44. 再回头看看为啥不推荐Executors提供几种线程池?

45. ThreadPoolExecutor线程池篇总结

JAVA并发专题《前引篇》相关推荐

  1. Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等

    继续并发专题~ FutureTask 有点类似Runnable,都可以通过Thread来启动,不过FutureTask可以返回执行完毕的数据,并且FutureTask的get方法支持阻塞. 由于:Fu ...

  2. java并发编程艺术——基础篇

    这篇文章目的是为了总结一下这段时间看<java并发编程艺术>学到的东西,尝试用自己的话说出来对java多线程的理解和使用. 一.什么是多线程,为什么要用多线程,多线程带来的挑战 多线程定义 ...

  3. Java 并发专题 : Semaphore 实现 互斥 与 连接池

    继续并发方面的知识.今天介绍Semaphore,同样在java.util.concurrent包下. 本来准备通过例子,从自己实现到最后使用并发工具实现,但是貌似效果并不是很好,有点太啰嗦的感觉,所有 ...

  4. Java 并发专题 CyclicBarrier 打造一个安全的门禁系统

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 继续并发专题~ 这 ...

  5. Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...

  6. Java并发专题 带返回结果的批量任务执行 CompletionService ExecutorService.invokeAll

    一般情况下,我们使用Runnable作为基本的任务表示形式,但是Runnable是一种有很大局限的抽象,run方法中只能记录日志,打印,或者把数据汇总入某个容器(一方面内存消耗大,另一方面需要控制同步 ...

  7. Java并发专题 带返回结果的批量任务运行 CompletionService ExecutorService.invokeAll

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27250059 普通情况下,我们使用Runnable作为主要的任务表示形式,可是R ...

  8. Java并发专题 带返回结果的批量任务执行 CompletionService ExecutorService.invokeAll(转)...

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27250059 一般情况下,我们使用Runnable作为基本的任务表示形式,但是R ...

  9. Java并发专题 带返回结果的批量任务执行 CompletionService ExecutorService invo

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27250059 一般情况下,我们使用Runnable作为基本的任务表示形式,但是R ...

最新文章

  1. 构造函数 原型对象 对象实例 图
  2. 工信部等六部门公布2021年度国家绿色数据中心名单
  3. python编写格斗游戏_C语言实现的开源 2D 格斗游戏: Punch Kick
  4. 使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
  5. MySQL过滤相同binlog_通过Linux命令过滤出binlog中完整的SQL语句
  6. debian查看ip地址命令_鲜为人知而又实用的 Linux 命令大全
  7. 输出四位完全平方数_leetcode279_go_完全平方数
  8. 2019小程序没必要做了_2019年什么行业适合做小程序
  9. 汉字转Base64的原理
  10. 冒险岛单机服务器修改,关于一树冒险岛单机技能 转数最新修改
  11. 适应度函数及遗传操作
  12. 卸载删除gitlab
  13. 基于OpenLayers的地图应用中图标汉化
  14. cmos电路多余输入端能否悬空_CMOS电路不使用的输入端不能悬空
  15. android 该文件包与具有同一名称的现有文件包存在冲突
  16. 二硬脂酰磷脂酰乙醇胺-聚乙二醇-巯基吡啶 DSPE-PEG-OPSS;常用于脂质体的合成
  17. ajax 提交间隔,jQuery+Ajax实现限制查询间隔的方法
  18. Java实现字数统计(中文英文韩文日文混合),类似word效果
  19. python中可选参数是什么意思_【IT专家】python 函数参数(必选参数、默认参数、可选参数、关键字参数)...
  20. ios客户端学习笔记(六):iOS客户端的工作流程

热门文章

  1. Marlin固件显示其他Gcode文件扩展名
  2. mastercam9.1标注尺寸点不到屏幕上 跟着鼠标动 确定不了
  3. UVa 616 - Coconuts, Revisited (数学)
  4. opengl 观察变换与投影变化 水壶 (学习笔记-仅供参考)
  5. 【十大排序算法系列】快速排序
  6. 信创办公–基于WPS的PPT最佳实践系列(表格和图标常用动画)
  7. Notepad++ 的XML格式化功能
  8. Python版在图片上添加图片
  9. 科技化浪潮下,金融牌照还有没有价值?
  10. linux使用手机共享网络设置密码,用Linux系统设置共享上网