目录 代码清单 44514084400484444444, 第1章介绍. 1.1并发的(非常)简短历史 1 1.2线程的优点… 3 1.3 线程的风险.… 1.4线程无处不在… .9 第1部分基础.… .13 第2章线程安全… .15 2.1什么是线程安全性 17 2.2原子性 .19 2.3锁. 23 2.4用锁来保护状态 .27 2.5活跃度与性能 29 第3章共享对象 33 3.1可见性 33 3.2发布和逸出 39 3.3线程封闭.… 42 3.4不可变性.… 46 3.5安全发布 49 第4章组合对象 .55 4.1设计线程安全的类 55 4.2实例限制… .58 4.3委托线程安全… 62 4.4向已有的线程安全类添加功能 .71 Java并发编程实践
xvi 目录 4.5同步策略的文档化… …74 第5章 构建块 .79 5.1同步容器… .79 5.2并发容器 .84 5.3阻塞队列和生产者-消费者模式 …87 5.4阻塞和可中断的方法.… 92 5.5 Synchronizer.... 94 5.6为计算结果建立高效、可伸缩的高速缓存 101 第2部分构建并发应用程序 .111 第6章任务执行.… .113 6.1在线程中执行任务… .113 6.2 Executor框架 .117 6.3寻找可强化的并行性 .123 第7章取消和关闭… .135 7.1任务取消… 135 7.2停止基于线程的服务 150 7.3处理反常的线程终止… 161 7.4JVM关闭… 164 第8章应用线程池.… .167 8.1任务与执行策略间的隐性耦合 167 8.2定制线程池的大小… 170 8.3配置ThreadPoolExecutor.… 171 8.4扩展ThreadPoolExecutor.. 179 8.5并行递归算法… 181 第9章GUI应用程序. …189 9.1为什么GUI是单线程化的 189 9.2短期的GU1任务… 192 9.3耗时GUI任务 195 9.4共享数据模型… 198 9.5其他形式的单线程子系统… .202 Jva并发编程实践
目录 xvii 第3部分 活跃度,性能和测试 .203 第10章 避免活跃度危险 205 10.1死锁 205 10.2避免和诊断死锁 215 10.3其他的活跃度危险… 218 第11章性能和可伸缩性 .221 11.1性能的思考… 221 11.2 Amdahl定律. .225 11.3线程引入的开销… .229 11.4减少锁的竞争… 232 11.5示例:比较Map的性能 242 11.6减少上下文切换的开销 243 第12章测试并发程序 247 12.1测试正确性 248 12.2测试性能.… 260 12.3避免性能测试的陷阱 266 12.4测试方法补遗… 270 第4部分 分高级主题.275 第13章 章显式锁..277 13.1L0ck和ReentrantL0ck.… 277 13.2对性能的考量… 282 13.3公平性… 283 13.4在synchronized和ReentrantL0ck之间进行选择 285 13.5读-写锁… 286 第14章构建自定义的同步工具 291 14.1管理状态依赖性… 291 14.2使用条件队列 298 14.3显式的Condition对象 306 14.4剖析Synchronizer… 308 14.5 AbstractQueuedSynchronizer..... 311 14.6jaVa.util.concurrent的Synchronizer类中的AQS..314 Java并发编程实践
xviii 目录 第15章原子变量与非阻塞同步机制 .319 15.1锁的劣势 319 15.2硬件对并发的支持 .321 15.3原子变量类… …324 15.4非阻塞算法… ..329 第l6章Java存储模型 .337 16.1什么是存储模型,要它何用 337 16.2发布. 344 16.3初始化安全性. 349 附录A同步Annotation..… ,,,,,3 A.l类Annotation… 353 A.2域Annotation和方法Annotation 353 参考文献355 Java并发编程实践
代码清单 清单1糟糕的列表排序方法(不要这样做) ...X 清单2缺少优化的列表排序方法… X 清单1.1非线程安全的序列生成器 .6 清单】2线程安全的序列生成器7 清单2.1一个无状态的S沦Vlet]8 清单2.2 Servlet计算请求数量而没有必要的同步(不要这样做) .19 清单2.3惰性初始化中存在竞争条件(不要这样做) 21 清单2.4 Servlet使用AtomicL0ng统计请求数.23 清单2.5没有正确原子化的Servlet试图缓存它的最新结果(不要这样做)…24 清单2.6缓存了最新结果的servlet,但响应性令人无法接受(不要这样做) .26 清单2.7如果内部锁不是可重入的,代码将死锁… 27 清单2.8缓存最新请求和结果的servlet.31 清单31在没有同步的情况下共享变量(不要这样做) 34 清单3.2非线程安全的可变整数访问器 .36 清单3.3线程安全的可变整数访问器 36 清单3.4数绵羊… 4.39 清单3.5发布对象 .40 清单3.6允许内部可变的数据逸出(不要这样做) 40 清单3.7隐式地允许this引用逸出(不要这样做) .41 清单3.8使用工厂方法防止his引用在构造期间逸出… …42 清单3.9本地的基本类型和引用类型的变量的线程限制 .44 清单3.l0使用Thread Local确保线程封闭性 .45 清单3.11构造于底层可变对象之上的不可变类.47 清单3.12在不可变的容器中缓存数字和它的因数. 49 清单3.l3使用到不可变容器对象的volatile类型引用,缓存最新的结果 .50 清单3.14在没有适当的同步的情况下就发布对象(不要这样做) 50 清单3.15如果Holder没有被正确发布,它将处于失败的风险中.51 清单4.1使用Java监视器模式的简单线程安全计数器 .56 清单4.2使用限制确保线程安全 …59 清单4.3私有锁保护状态… 6 Java并发编程实践