站在巨人的肩膀上学习:五位阿里大牛联手撰写的《深入浅出 Java 多线程》
写在前面
多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。
笔者在读完市面上关于 Java 并发编程的资料后,感觉有些知识点不是很清晰,于是在 RedSpider 社区内展开了对 Java 并发编程原理的讨论。鉴于开源精神,我们决定将我们讨论之后的 Java 并发编程原理整理成书籍,分享给大家。
站在巨人的肩上,我们可以看得更远。本书内容的主要来源有博客、书籍、论文,对于一些已经叙述得很清晰的知识点我们直接引用在本书中;对于一些没有讲解清楚的知识点,我们加以画图或者编写 Demo 进行加工;而对于一些模棱两可的知识点,本书在查阅了大量资料的情况下,给出最合理的解释。
写本书的过程也是对自己研究和掌握的技术点进行整理的过程,希望本书能帮助读者快速掌握并发编程技术。
内容简介
第 1 章 进程与线程的基本概念
1.1 进程产生的背景
1.2 上下文切换
第 2 章 Java 多线程入门类和接口
2.1 Thread 类和 Runnable 接口
2.1.1 继承 Thread 类
2.1.2 实现 Runnable 接口
2.1.3 Thread 类构造方法
2.1.4 Thread 类的几个常用方法
2.1.5 Thread 类与 Runnable 接口的比较
2.2 Callable、Future 与 FutureTask
2.2.1 Callable 接口
2.2.2 Future 接口
2.2.3 FutureTask 类
2.2.4 FutureTask 的几个状态
第 3 章 线程组和线程优先级
3.1 线程组(ThreadGroup)
3.2 线程的优先级
3.3 线程组的常用方法及数据结构
3.3.1 线程组的常用方法
3.3.2 线程组的数据结构
第 4 章 Java 线程的状态及主要转化方法
4.1 操作系统中的线程状态转换
4.2 Java 线程的 6 个状态
4.2.1 NEW
4.2.2 RUNNABLE
4.2.3 BLOCKED
4.2.4 WAITING
4.2.5 TIMED_WAITING
4.2.6 TERMINATED
4.3 线程状态的转换
4.3.1 BLOCKED 与 RUNNABLE 状态的转换
4.3.2 WAITING 状态与 RUNNABLE 状态的转换
4.3.3 TIMED_WAITING 与 RUNNABLE 状态转换
4.3.4 线程中断
第 5 章 Java 线程间的通信
5.1 锁与同步
5.2 等待/通知机制
5.3 信号量
5.4 管道
5.5 其它通信相关
5.5.1 join 方法
5.5.2 sleep 方法
5.5.3 ThreadLocal 类
5.5.4 InheritableThreadLocal
第 6 章 Java 内存模型基础知识
6.1 并发编程模型的两个关键问题
6.2 Java 内存模型的抽象结构
6.2.1 运⾏时内存的划分
6.2.2 既然堆是共享的,为什么在堆中会有内存不可⻅问题?
6.2.3 JMM 与 Java 内存区域划分的区别与联系
第 7 章 重排序与 happens-before
7.1 什么是重排序?
7.2 顺序一致性模型与 JMM 的保证
7.2.1 数据竞争与顺序一致性
7.2.2 顺序一致性模型
7.2.3 JMM 中同步程序的顺序一致性效果
7.2.4 JMM 中未同步程序的顺序一致性效果
7.3 happens-before
7.3.1 什么是 happens-before?
7.3.2 天然的 happens-before 关系
第 8 章 volatile
8.1 几个基本概念
8.1.1 内存可见性
8.1.2 重排序
8.1.3 happens-before 规则
8.2 volatile 的内存语义
8.2.1 内存可见性
8.2.1 禁止重排序
8.3 volatile 的用途
第 9 章 synchronized 与锁
9.1 Synchronized 关键字
9.2 几种锁
9.2.1 Java 对象头
9.2.2 偏向锁
9.2.3 轻量级锁
9.2.4 重量级锁
9.2.5 总结锁的升级流程
9.2.6 各种锁的优缺点对比
第 10 章 乐观锁和悲观锁
10.1 乐观锁与悲观锁的概念
10.2 CAS 的概念
10.3 Java 实现 CAS 的原理 - Unsafe 类
10.4 原子操作-AtomicInteger 类源码简析
10.5 CAS 实现原子操作的三大问题
10.5.1 ABA 问题
10.5.2 循环时间长开销大
10.5.3 只能保证一个共享变量的原子操作
转发+关注,然后私信回复我 “多线程” 即可获得《深入浅出 Java 多线程》文档资料的免费领取方式。
第 11 章 AQS
11.1 AQS 简介
11.2 AQS 的数据结构
11.3 资源共享模式
11.4 AQS 的主要方法源码解析
11.4.1 获取资源
第 12 章 线程池原理
12.1 为什么要使用线程池
12.2 线程池的原理
12.2.1 ThreadPoolExecutor 提供的构造方法
12.2.2 ThreadPoolExecutor 的策略
12.2.3 线程池主要的任务处理流程
12.2.4 ThreadPoolExecutor 如何做到线程复用的?
12.3 四种常见的线程池
12.3.1 newCachedThreadPool
12.3.2 newFixedThreadPool
12.3.3 newSingleThreadExecutor
12.3.4 newScheduledThreadPool
第 13 章 阻塞队列
13.1 阻塞队列的由来
13.2 BlockingQueue 的操作方法
13.3 BlockingQueue 的实现类
13.3.1 ArrayBlockingQueue
13.3.2 LinkedBlockingQueue
13.3.3 DelayQueue
13.3.4 PriorityBlockingQueue
13.3.5 SynchronousQueue
13.5 阻塞队列的原理
13.6 示例和使用场景
13.6.1 生产者-消费者模型
13.6.2 线程池中使用阻塞队列
第 14 章 锁接口和类
14.1 synchronized 的不足之处
14.2 锁的几种分类
14.2.1 可重入锁和非可重入锁
14.2.2 公平锁与非公平锁
14.2.3 读写锁和排它锁
14.3 JDK 中有关锁的一些接口和类
14.3.1 抽象类 AQS/AQLS/AOS
14.3.2 接口 Condition/Lock/ReadWriteLock
14.3.3 ReentrantLock
14.3.4 ReentrantReadWriteLock
14.3.5 StampedLock
第 15 章 并发容器集合
15.1 同步容器与并发容器
15.2 并发容器类介绍
15.2.1 并发 Map
15.2.2 并发 Queue
15.2.3 并发 Set
第 16 章 CopyOnWrite 容器
16.1 什么是 CopyOnWrite 容器
16.2 CopyOnWriteArrayList
16.3 CopyOnWrite 的业务中实现
第 17 章 通信工具类
17.1 Semaphore
17.1.1 Semaphore 介绍
17.1.2 Semaphore 案例
17.1.3 Semaphore 原理
17.2 Exchanger
17.3 CountDownLatch
17.3.1 CountDownLatch 介绍
17.3.2 CountDownLatch 案例
17.3.3 CountDownLatch 原理
17.4 CyclicBarrier
17.4.1 CyclicBarrier 介绍
17.4.2 CyclicBarrier Barrier 被破坏
17.4.3 CyclicBarrier 案例
17.4.4 CyclicBarrier 原理
17.5 Phaser
17.5.1 Phaser 介绍
17.5.2 Phaser 案例
17.5.3 Phaser 原理
第 18 章 Fork/Join 框架
18.1 什么是 Fork/Join
18.2 工作窃取算法
18.3 Fork/Join 的具体实现
18.3.1 ForkJoinTask
18.3.2 ForkJoinPool
18.4 Fork/Join 的使用
第 19 章 Java 8 Stream 并行计算原理
19.1 Java 8 Stream 简介
19.2 Stream 单线程串行计算
19.3 Stream 多线程并行计算
19.4 从源码看 Stream 并行计算原理
19.5 Stream 并行计算的性能提升
第二十章 计划任务
20.1 使用案例
20.2 类结构
20.3 主要方法介绍
20.3.1 schedule
20.3.2 scheduledAtFixedRate
20.3.3 scheduledAtFixedDelay
20.3.4 delayedExecute
20.4 DelayedWorkQueue
20.4.1 take
20.4.2 offer
20.5 总结
评论 (1 条评论)