|
3 | 3 | <!-- TOC depthFrom:2 depthTo:3 --> |
4 | 4 |
|
5 | 5 | - [第 1 章 简介](#第-1-章-简介) |
6 | | - - [1.1 并发简史](#11-并发简史) |
7 | | - - [1.2 线程的优势](#12-线程的优势) |
8 | | - - [1.3 线程带来的风险](#13-线程带来的风险) |
9 | | - - [1.4 线程无处不在](#14-线程无处不在) |
| 6 | + - [1.1 并发简史](#11-并发简史) |
| 7 | + - [1.2 线程的优势](#12-线程的优势) |
| 8 | + - [1.3 线程带来的风险](#13-线程带来的风险) |
| 9 | + - [1.4 线程无处不在](#14-线程无处不在) |
10 | 10 | - [第 2 章 线程安全性](#第-2-章-线程安全性) |
11 | | - - [2.1 什么是线程安全性](#21-什么是线程安全性) |
12 | | - - [2.2 原子性](#22-原子性) |
13 | | - - [2.3 加锁机制](#23-加锁机制) |
14 | | - - [2.4 用锁来保护状态](#24-用锁来保护状态) |
15 | | - - [2.5 活跃性与性能](#25-活跃性与性能) |
| 11 | + - [2.1 什么是线程安全性](#21-什么是线程安全性) |
| 12 | + - [2.2 原子性](#22-原子性) |
| 13 | + - [2.3 加锁机制](#23-加锁机制) |
| 14 | + - [2.4 用锁来保护状态](#24-用锁来保护状态) |
| 15 | + - [2.5 活跃性与性能](#25-活跃性与性能) |
16 | 16 | - [第 3 章 对象的共享](#第-3-章-对象的共享) |
17 | | - - [3.1 可见性](#31-可见性) |
18 | | - - [3.2 发布与逸出](#32-发布与逸出) |
19 | | - - [3.3 线程封闭](#33-线程封闭) |
20 | | - - [3.4 不变性](#34-不变性) |
21 | | - - [3.5 安全发布](#35-安全发布) |
| 17 | + - [3.1 可见性](#31-可见性) |
| 18 | + - [3.2 发布与逸出](#32-发布与逸出) |
| 19 | + - [3.3 线程封闭](#33-线程封闭) |
| 20 | + - [3.4 不变性](#34-不变性) |
| 21 | + - [3.5 安全发布](#35-安全发布) |
22 | 22 | - [第 4 章 对象的组合](#第-4-章-对象的组合) |
23 | | - - [4.1 设计线程安全的类](#41-设计线程安全的类) |
24 | | - - [4.2 实例封闭](#42-实例封闭) |
25 | | - - [4.3 线程安全性的委托](#43-线程安全性的委托) |
26 | | - - [4.4 在现有的线程安全类中添加功能](#44-在现有的线程安全类中添加功能) |
27 | | - - [4.5 将同步策略文档化](#45-将同步策略文档化) |
| 23 | + - [4.1 设计线程安全的类](#41-设计线程安全的类) |
| 24 | + - [4.2 实例封闭](#42-实例封闭) |
| 25 | + - [4.3 线程安全性的委托](#43-线程安全性的委托) |
| 26 | + - [4.4 在现有的线程安全类中添加功能](#44-在现有的线程安全类中添加功能) |
| 27 | + - [4.5 将同步策略文档化](#45-将同步策略文档化) |
28 | 28 | - [第 5 章 基础构建模块](#第-5-章-基础构建模块) |
29 | | - - [5.1 同步容器类](#51-同步容器类) |
30 | | - - [5.2 并发容器](#52-并发容器) |
31 | | - - [5.3 BlockingQueue](#53-blockingqueue) |
32 | | - - [5.4 阻塞方法与中断方法](#54-阻塞方法与中断方法) |
33 | | - - [5.5 同步工具类](#55-同步工具类) |
34 | | - - [5.6 构建高效且可伸缩的结果缓存](#56-构建高效且可伸缩的结果缓存) |
| 29 | + - [5.1 同步容器类](#51-同步容器类) |
| 30 | + - [5.2 并发容器](#52-并发容器) |
| 31 | + - [5.3 BlockingQueue](#53-blockingqueue) |
| 32 | + - [5.4 阻塞方法与中断方法](#54-阻塞方法与中断方法) |
| 33 | + - [5.5 同步工具类](#55-同步工具类) |
| 34 | + - [5.6 构建高效且可伸缩的结果缓存](#56-构建高效且可伸缩的结果缓存) |
35 | 35 | - [第 6 章 任务执行](#第-6-章-任务执行) |
36 | | - - [6.1 在线程中执行任务](#61-在线程中执行任务) |
37 | | - - [6.2 Executor 框架](#62-executor-框架) |
38 | | - - [6.3 找出可利用的并行性](#63-找出可利用的并行性) |
| 36 | + - [6.1 在线程中执行任务](#61-在线程中执行任务) |
| 37 | + - [6.2 Executor 框架](#62-executor-框架) |
| 38 | + - [6.3 找出可利用的并行性](#63-找出可利用的并行性) |
39 | 39 | - [第 7 章 取消与关闭](#第-7-章-取消与关闭) |
40 | | - - [7.1 任务取消](#71-任务取消) |
41 | | - - [7.2 停止基于线程的服务](#72-停止基于线程的服务) |
42 | | - - [7.3 处理非正常的线程终止](#73-处理非正常的线程终止) |
43 | | - - [7.4 JVM 关闭](#74-jvm-关闭) |
| 40 | + - [7.1 任务取消](#71-任务取消) |
| 41 | + - [7.2 停止基于线程的服务](#72-停止基于线程的服务) |
| 42 | + - [7.3 处理非正常的线程终止](#73-处理非正常的线程终止) |
| 43 | + - [7.4 JVM 关闭](#74-jvm-关闭) |
44 | 44 | - [第 8 章 线程池的使用](#第-8-章-线程池的使用) |
45 | | - - [8.1 在任务与执行策略之间的隐性耦合](#81-在任务与执行策略之间的隐性耦合) |
46 | | - - [8.2 设置线程池的大小](#82-设置线程池的大小) |
47 | | - - [8.3 配置 ThreadPoolExecutor](#83-配置-threadpoolexecutor) |
48 | | - - [8.4 扩展 ThreadPoolExecutor](#84-扩展-threadpoolexecutor) |
49 | | - - [8.5 递归算法的并行化](#85-递归算法的并行化) |
| 45 | + - [8.1 在任务与执行策略之间的隐性耦合](#81-在任务与执行策略之间的隐性耦合) |
| 46 | + - [8.2 设置线程池的大小](#82-设置线程池的大小) |
| 47 | + - [8.3 配置 ThreadPoolExecutor](#83-配置-threadpoolexecutor) |
| 48 | + - [8.4 扩展 ThreadPoolExecutor](#84-扩展-threadpoolexecutor) |
| 49 | + - [8.5 递归算法的并行化](#85-递归算法的并行化) |
50 | 50 | - [第 9 章 图形用户界面应用程序](#第-9-章-图形用户界面应用程序) |
51 | 51 | - [第 10 章 避免活跃性危险](#第-10-章-避免活跃性危险) |
52 | | - - [10.1 死锁](#101-死锁) |
53 | | - - [10.2 死锁的避免与诊断](#102-死锁的避免与诊断) |
54 | | - - [10.3 其他活跃性危险](#103-其他活跃性危险) |
| 52 | + - [10.1 死锁](#101-死锁) |
| 53 | + - [10.2 死锁的避免与诊断](#102-死锁的避免与诊断) |
| 54 | + - [10.3 其他活跃性危险](#103-其他活跃性危险) |
55 | 55 | - [第 11 章 性能与可伸缩性](#第-11-章-性能与可伸缩性) |
56 | | - - [11.1 对性能的思考](#111-对性能的思考) |
57 | | - - [11.2 Amdahl 定律](#112-amdahl-定律) |
58 | | - - [11.3 线程引入的开销](#113-线程引入的开销) |
59 | | - - [11.4 减少锁的竞争](#114-减少锁的竞争) |
60 | | - - [11.5 示例:比较 Map 的性能](#115-示例比较-map-的性能) |
61 | | - - [11.6 减少上下文切换的开销](#116-减少上下文切换的开销) |
| 56 | + - [11.1 对性能的思考](#111-对性能的思考) |
| 57 | + - [11.2 Amdahl 定律](#112-amdahl-定律) |
| 58 | + - [11.3 线程引入的开销](#113-线程引入的开销) |
| 59 | + - [11.4 减少锁的竞争](#114-减少锁的竞争) |
| 60 | + - [11.5 示例:比较 Map 的性能](#115-示例比较-map-的性能) |
| 61 | + - [11.6 减少上下文切换的开销](#116-减少上下文切换的开销) |
62 | 62 | - [第 12 章 并发程序的测试](#第-12-章-并发程序的测试) |
63 | | - - [12.1 正确性测试](#121-正确性测试) |
64 | | - - [12.2 性能测试](#122-性能测试) |
65 | | - - [12.3 避免性能测试的陷阱](#123-避免性能测试的陷阱) |
66 | | - - [12.4 其他的测试方法](#124-其他的测试方法) |
| 63 | + - [12.1 正确性测试](#121-正确性测试) |
| 64 | + - [12.2 性能测试](#122-性能测试) |
| 65 | + - [12.3 避免性能测试的陷阱](#123-避免性能测试的陷阱) |
| 66 | + - [12.4 其他的测试方法](#124-其他的测试方法) |
67 | 67 | - [第 13 章 显式锁](#第-13-章-显式锁) |
68 | | - - [13.1 Lock 与 ReentrantLock](#131-lock-与-reentrantlock) |
69 | | - - [13.2 性能考虑因素](#132-性能考虑因素) |
70 | | - - [13.3 公平性](#133-公平性) |
71 | | - - [13.4 在 synchronized 和 ReentrantLock 之间进行选择](#134-在-synchronized-和-reentrantlock-之间进行选择) |
72 | | - - [13.5 读-写锁](#135-读-写锁) |
| 68 | + - [13.1 Lock 与 ReentrantLock](#131-lock-与-reentrantlock) |
| 69 | + - [13.2 性能考虑因素](#132-性能考虑因素) |
| 70 | + - [13.3 公平性](#133-公平性) |
| 71 | + - [13.4 在 synchronized 和 ReentrantLock 之间进行选择](#134-在-synchronized-和-reentrantlock-之间进行选择) |
| 72 | + - [13.5 读-写锁](#135-读-写锁) |
73 | 73 | - [第 14 章 构建自定义的同步工具](#第-14-章-构建自定义的同步工具) |
74 | | - - [14.1 状态依赖性的管理](#141-状态依赖性的管理) |
75 | | - - [14.2 使用条件队列](#142-使用条件队列) |
76 | | - - [14.3 显式的 Condition 对象](#143-显式的-condition-对象) |
77 | | - - [14.4 Synchronizer 剖析](#144-synchronizer-剖析) |
78 | | - - [14.5 AbstractQueuedSynchronizer](#145-abstractqueuedsynchronizer) |
79 | | - - [14.6 java.util.concurrent 同步器类中的 AQS](#146-javautilconcurrent-同步器类中的-aqs) |
| 74 | + - [14.1 状态依赖性的管理](#141-状态依赖性的管理) |
| 75 | + - [14.2 使用条件队列](#142-使用条件队列) |
| 76 | + - [14.3 显式的 Condition 对象](#143-显式的-condition-对象) |
| 77 | + - [14.4 Synchronizer 剖析](#144-synchronizer-剖析) |
| 78 | + - [14.5 AbstractQueuedSynchronizer](#145-abstractqueuedsynchronizer) |
| 79 | + - [14.6 java.util.concurrent 同步器类中的 AQS](#146-javautilconcurrent-同步器类中的-aqs) |
80 | 80 | - [第 15 章 原子变量与非阻塞同步机制](#第-15-章-原子变量与非阻塞同步机制) |
81 | | - - [15.1 锁的劣势](#151-锁的劣势) |
82 | | - - [15.2 硬件对并发的支持](#152-硬件对并发的支持) |
83 | | - - [15.3 原子变量类](#153-原子变量类) |
84 | | - - [15.4 非阻塞算法](#154-非阻塞算法) |
| 81 | + - [15.1 锁的劣势](#151-锁的劣势) |
| 82 | + - [15.2 硬件对并发的支持](#152-硬件对并发的支持) |
| 83 | + - [15.3 原子变量类](#153-原子变量类) |
| 84 | + - [15.4 非阻塞算法](#154-非阻塞算法) |
85 | 85 | - [第 16 章 Java 内存模型](#第-16-章-java-内存模型) |
86 | | - - [16.1 什么是内存模型,为什么需要它](#161-什么是内存模型为什么需要它) |
87 | | - - [16.2 发布](#162-发布) |
88 | | - - [16.3 初始化过程中的安全性](#163-初始化过程中的安全性) |
| 86 | + - [16.1 什么是内存模型,为什么需要它](#161-什么是内存模型为什么需要它) |
| 87 | + - [16.2 发布](#162-发布) |
| 88 | + - [16.3 初始化过程中的安全性](#163-初始化过程中的安全性) |
89 | 89 |
|
90 | 90 | <!-- /TOC --> |
91 | 91 |
|
@@ -246,19 +246,24 @@ Java 提供了一种内置的锁机制来支持原子性:synchronized。 |
246 | 246 | * BlockingQueue 提供了可阻塞的 put 和 take 方法,以及支持定时的 offer 和 poll 方法。如果队列满了,那么 put 方法将阻塞直到有空间可用;如果列队为空,那么 take 方法将阻塞到有元素可用。队列可以是有界的或无界的,无界队列永远不会填满,所以无界队列的 put 方法永远不会阻塞。 |
247 | 247 | * BlockingQueue 支持生产者-消费者模式。 |
248 | 248 | * BlockingQueue 的实现:LinkedBlockingQueue 和 ArrayBlockingQueue 是 FIFO 队列。PriorityBlockingQueue 是一个按优先级排序的队列。 |
249 | | - |
250 | | -* 5.3.1 示例:桌面搜索 |
251 | | -* 5.3.2 串行线程封闭 |
252 | | -* 5.3.3 双端队列与工作密取 |
| 249 | +* SynchronousQueue 维护一组线程,这些线程在等待着把元素加入或移出队列。因为 SynchronousQueue 没有存储功能,因此 put 和 take 会一直阻塞,直到有另一个线程已经准备好参与到交付过程中。仅当有足够多的消费者,并且总是有一个消费者准备好获取交付的工作时,才适合使用同步队列。 |
253 | 250 |
|
254 | 251 | ### 5.4 阻塞方法与中断方法 |
255 | 252 |
|
| 253 | +* 线程阻塞的原因:等待 I/O 操作结束;等待获得一个锁;等待从 Thread.sleep 方法中唤醒;等待另一个线程的计算结果。 |
| 254 | +* Thread 提供了 interrupt 方法,用于中断线程或查询线程是否已经被中断。每个线程都有一个 boolean 型的属性,表示线程的中断状态,当中断线程时将设置这个状态。 |
| 255 | +* 中断是一种协作机制,一个线程不能勉强其他线程停止正在执行的操作而去执行其他的操作。 |
| 256 | +* InterruptException 处理 |
| 257 | + * 传递 InterruptException |
| 258 | + * 恢复中断 |
| 259 | + |
256 | 260 | ### 5.5 同步工具类 |
257 | 261 |
|
258 | | -* 5.5.1 闭锁 |
259 | | -* 5.5.2 FutureTask |
260 | | -* 5.5.3 信号量 |
261 | | -* 5.5.4 栅栏 |
| 262 | +TODO: |
| 263 | +* CountDownLatch |
| 264 | +* FutureTask |
| 265 | +* Semaphore |
| 266 | +* CyclicBarrier |
262 | 267 |
|
263 | 268 | ### 5.6 构建高效且可伸缩的结果缓存 |
264 | 269 |
|
|
0 commit comments