资深阿里P8大佬十年经验总结“Java并发编程核心方法与框架笔记
首先我们先来了解一下什么是 并发编程
?
并发的概念:同时拥有两个或更多的线程,如果是单核CPU,则这多个线程交替获取CPU资源,轮流执行,同一时刻只有一个处于执行状态,其它线程处于其它状态(JVM模型中,线程都有哪些状态?初始状态、就绪状态、运行中状态、阻塞、等待、超时等待、终止);如果是多核CPU,则核心数个线程将同时获取CPU资源,同时执行,多余的线程仍然需要和这些执行中的线程交替获取CPU资源。
为什么大佬要写这份笔记?
早在几年前笔者就曾想过整理一份与 Java 并发包有关的笔记。因为市面上所有的 Java 学习资源都是以 1 章或 2 章的篇幅介绍 Java 并发包技术,这就导致对 Java 并发包的讲解并不是非常详尽,包含的知识量远远不够,并没有完整覆盖 Java 并发包的知识点。
这份笔记将给大家一个完整的视角,秉承 “大道至简” 的主导思想,只介绍 Java 并发包开发中最值得关注的内容,希望能抛砖引玉,以个人的一些想法和见解,为大家拓展出更深入、全面的思路。
笔记适用于一下这些对象:
- Java 初级、中级程序员
- Java 多线程开发者
- Java 并发开发者
- 系统架构师
- 大数据开发者
- 其他对多线程技术感兴趣的人员
本笔记有一下几个特点:
- 不留遗漏——全面覆盖Java并发知识点;
- 直击要害——实战化案例 ,精准定位技术细节;
- 学以致用——精要式演示,确保开发/学习不脱节;
- 潜移默化——研磨式知识讲解 ,参透技术要点;
- 提升效率——垂直式技术精解,不绕弯路;
- 循序提升——渐进式知识点统排 ,确保连贯。
由于内容较多,本次将展示部分,如果看得不过瘾想更加深入地了解本笔记彻底掌握
Java 并发编程
可在文末了解详情。
第一章 Semaphore和Exchanger的使用
第一章讲解了 Semaphore
和 Exchanger 类
的使用,学完本章后,能更好地控制线程间的同步性,以及线程间如何更好、更方便地传输数据。
-
Semaphore
的使用 -
Exchanger
的使用 - 本章总结
第二章 CountDownLatch和CyclicBarrier的使用
第二章是第一章的延伸,主要讲解了CountDownLatch
、CyclicBarrier 类
的使用及在Java并发包中对并发访问的控制。本章主要包括Semaphore
、CountDownLatch
和CyclicBarrier
的使用,它们在使用上非常灵活,所以对于API的介绍比较详细,为读者学习控制同步打好坚实的基础。
-
CountDownLatch
的使用 -
CyclicBarrier
的使用 - 本章总结
第三章 Phaser的使用
第三章是第二章的升级,由于 CountDownLatch
和 CyclicBarrier类
都有相应的弊端,所以在 JDK1.7中新增了 Phaser类
来解决这些缺点。
-
Phaser
的使用 -
类Phaser
的arriveAndAwaitAdvance()方法
测试1 -
类Phaser
的arriveAndAwaitAdvance()方法
测试2 -
类Phaser
的arriveAndDeregister()方法
测试 -
类Phaser
的getPhase()和onAdvance()方法
测试 -
类Phaser
的getRegisteredParties()方法
和register()
测试 -
类Phaser
的bulkRegister()方法
测试 -
类Phaser
的getArrivedParties()
和getUnarrivedParties()方法
测试 -
类Phaser
的arrive()方法
测试1 -
类Phaser
的arrive ()方法
测试2 -
类Phaser
的awaitAdvance(int phase)方法
测试 -
类Phaser
的awaitAdvanceInterruptibly(int)方法
测试1 -
类Phaser
的awaitAdvanceInterruptibly(int)方法
测试2 -
类Phaser
的awaitAdvanceInterruptibly(int)方法
测试3 -
类Phaser
的awaitAdvanceInterruptibly(int,long,TimeUnit)方法
测试4 -
类Phaser
的forceTermination()
和isTerminated()方法
测试 -
控制Phaser类
的运行时机 - 本章总结
第四章 Executor与ThreadPoolExecutor的使用
第四章中讲解了Executor 接口
与ThreadPoolExecutor线程池
的使用,可以说本章中的知识也是Java并发包中主要的应用技术点,线程池技术也在众多的高并发业务环境中使用。掌握线程池能更有效地提高程序运行效率,更好地统筹线程执行的相关任务。
- Executor接口介绍
- 使用Executors工厂类创建线程池
-
ThreadPoolExecutor
的使用 - 本章总结
第五章 Future和Callable的使用
第5章中讲解Future
和Callable
的使用,接口Runnable
并不支持返回值,但在有些情况下真的需要返回值,所以Future
就是用来解决这样的问题的。
-
Future
和Callable
的介绍 - 方法
get()
结合ExecutorService
中的submit(Callable)
的使用 - 方法
get()
结合ExecutorService
中的submit(Runnable)
和isDone()
的使用 - 使用ExecutorService接口中的方法
submit(Runnable, T result)
- 方法
cancel(boolean mayInterruptIfRunning)
和isCancelled()
的使用 - 方法
get(long timeout, TimeUnit unit)
的使用 - 异常的处理
- 自定义拒绝策略
RejectedExecutionHandler接口
的使用 - 方法
execute()
与submit()
的区别 - 验证
Future
的缺点 - 本章总结
第六章 CompletionService的使用
第六章介绍Java并发包中的CompletionService
的使用,该接口可以增强程序运行效率,因为可以以异步的方式获得任务执行的结果。
-
CompletionService
介绍 - 使用
CompletionService
解决Future
的缺点 - 使用
take()方法
- 使用
poll()方法
- 使用
poll(long timeout, TimeUnit unit)方法
-
类CompletionService
与异常 - 方法
Future submit(Runnable task, V result)
的测试 - 本章总结
第七章 接口ExecutorService的方法使用
第七章主要介绍的是ExecutorService接口
,该接口提供了若干方法来方便地执行业务,是比较常见的工具接口对象。
- 在
ThreadPoolExecutor
中使用ExecutorService
中的方法 - 方法
invokeAny(Collection tasks)
的使用与interrupt
- 方法
invokeAny()
与执行慢的任务异常 - 方法
invokeAny()
与执行快的任务异常 - 方法
invokeAny()
与全部异常 - 方法
invokeAny(CollectionTasks, timeout, timeUnit)
超时的测试 - 方法
invokeAll(Collection tasks)
全正确 - 方法
invokeAll(Collection tasks)
快的正确慢的异常 - 方法
invokeAll(Collection tasks)
快的异常慢的正确 - 方法
invokeAll(Collection tasks,long timeout,TimeUnit unit)
先慢后快 - 方法
invokeAll(Collection tasks,long timeout,TimeUnit unit)
先快后慢 - 方法
invokeAll(Collection tasks,long timeout,TimeUnit unit)
全慢 - 本章总结
第八章 计划任务ScheduledExecutorService的使用
第八章主要介绍计划任务ScheduledExecutorService
的使用,学完本章可以掌握如何将计划任务与线程池结合使用。
-
ScheduledExecutorService
的使用 -
ScheduledThreadPoolExecutor
使用Callable
延迟运行 -
ScheduledThreadPoolExecutor
使用Runnable
延迟运行 - 延迟运行并取得返回值
- 使用
scheduleAtFixedRate()方法
实现周期性执行 - 使用
scheduleWithFixedDelay()方法
实现周期性执行 - 使用
getQueue()
与remove()方法
- 方法
setExecuteExistingDelayedTasksAfterShutdownPolicy()
的使用 - 方法
setContinueExistingPeriodicTasksAfterShutdownPolicy()
- 使用
cancel(boolean)
与setRemoveOnCancelPolicy()方法
- 本章总结
第九章 Fork-Join分治编程
第九章主要介绍Fork-Join分治编程
。分治编程在多核计算机中应用很广,它可以将大的任务拆分成小的任务再执行,最后再把执行的结果聚合到一起,完全利用多核CPU的优势,加快程序运行效率。
-
Fork-Join分治编程
与类结构 - 使用
RecursiveAction
让任务跑起来 - 使用
RecursiveAction
分解任务 - 使用
RecursiveTask
取得返回值与join()
和get()方法
的区别 - 使用
RecursiveTask
执行多个任务并打印返回值 - 使用
RecursiveTask
实现字符串累加 - 使用
Fork-Join
实现求和:实验1 - 使用
Fork-Join
实现求和:实验2 - 类
ForkJoinPool
核心方法的实验 - 类
ForkJoinTask
对异常的处理 - 本章总结
第十章 并发集合框架
第十章主要介绍并发集合框架。Java 中的集合在开发项目时占有举足轻重的地位,在 Java并发包中也提供了在高并发环境中使用的Java集合工具类,读者需要着重掌握Queue接口
的使用。
- 集合框架结构简要
- 非阻塞队列
- 阻塞队列
- 本章总结
最后
免费获取方式:点赞&关注后,私信【Java并发编程】获取免费下载链接!