作者简介:结城浩生于1963年,日本资深技术作家和程序员。在编程语言、设计模式、数学、加密技术等领域,编写了很多深受欢迎的入门书。代表作有《数学女孩》系列、《程序员的数学》、《图解密码技术》等。侯振龙管理科学与工程专业硕士,日语一级,软件开发工程师,具有十年对日软件开发经验,现就职于某日本独资企业。译者简介:杨文轩华中科技大学硕士,擅长Web 2.0开发,有丰富的对日开发经验。现就职于日本方正股份有限公司。译作有《图解基础设施设计模式》《C现代编程:集成开发环境、设计模式、极限编程、测试驱动开发、重构、持续集成》及《图解设计模式》。
本书通过具体的Java 程序,以浅显易懂的语言逐一说明了多线程和并发处理中常用的12 种设计模式。内容涉及线程的基础知识、线程的启动与终止、线程间的互斥处理与协作、线程的有效应用、线程的数量管理以及性能优化的注意事项等。此外,还介绍了一些多线程编程时容易出现的失误,以及多线程程序的阅读技巧等。在讲解过程中,不仅以图配文,理论结合实例,而且提供了运用模式解决具体问题的练习题和答案,帮助读者加深对多线程和并发处理的理解,并掌握其使用技巧。
序章1 Java线程 1I1.1 Java线程 2I1.2 何谓线程 2明为跟踪处理流程,实为跟踪线程 2单线程程序 3多线程程序 4Thread类的run方法和start方法 5I1.3 线程的启动 9线程的启动(1)——利用Thread类的子类 9线程的启动(2)——利用Runnable接口 10I1.4 线程的暂停 12I1.5 线程的互斥处理 13synchronized方法 14synchronized代码块 17I1.6 线程的协作 18等待队列——线程休息室 19wait方法——将线程放入等待队列 19notify方法——从等待队列中取出线程 21notifyAll方法——从等待队列中取出所有线程 23wait、notify、notifyAll是Object类的方法 24I1.7 线程的状态迁移 24I1.8 线程相关的其他话题 26I1.9 本章所学知识 26I1.10 练习题 26序章2 多线程程序的评价标准 31I2.1 多线程程序的评价标准 32安全性——不损坏对象 32生存性——必要的处理能够被执行 32可复用性——类可重复利用 33性能——能快速、大批量地执行处理 33评价标准总结 33I2.2 本章所学知识 34I2.3 练习题 34第1章 Single Threaded Execution模式——能通过这座桥的只有一个人 351.1 Single Threaded Execution模式 361.2 示例程序1:不使用Single Threaded Execution模式的程序 36Main类 37非线程安全的Gate类 37UserThread类 38执行起来看看……出错了 39为什么会出错呢 401.3 示例程序2:使用Single Threaded Execution模式的程序 41线程安全的Gate类 41synchronized的作用 421.4 Single Threaded Execution模式中的登场角色 431.5 拓展思路的要点 44何时使用(可使用Single Threaded Execution模式的情况) 44生存性与死锁 45可复用性和继承反常 46临界区的大小和性能 461.6 相关的设计模式 47Guarded Suspension模式 47Read-Write Lock模式 47Immutable模式 47Thread-Specific Storage模式 481.7 延伸阅读1:关于synchronized 48synchronized语法与Before/After模式 48synchronized在保护着什么 49该以什么单位来保护呢 50使用哪个锁保护 50原子操作 51long与double的操作不是原子的 511.8 延伸阅读2:java.util.concurrent包和计数信号量 52计数信号量和Semaphore类 52使用Semaphore类的示例程序 521.9 本章所学知识 551.10 练习题 55第2章 Immutable模式——想破坏也破坏不了 612.1 Immutable模式 622.2 示例程序 62使用Immutable模式的Person类 62Main类 63PrintPersonThread类 632.3 Immutable模式中的登场角色 652.4 拓展思路的要点 66何时使用(可使用Immutable模式的情况) 66考虑成对的mutable类和immutable类 [性能] 66为了确保不可变性 [可复用性] 67标准类库中用到的Immutable模式 672.5 相关的设计模式 69Single Threaded Execution模式 69Read-Write Lock模式 69Flyweight模式 692.6 延伸阅读1:final 69final的含义 692.7 延伸阅读2:集合类与多线程 71示例1:非线程安全的java.util.ArrayList类 71示例2:利用Collections.synchronizedList方法所进行的同步 74示例3:使用copy-on-write的java.util.concurrent.CopyOnWriteArrayList类 752.8 本章所学知识 762.9 练习题 77第3章 Guarded Suspension模式——等我准备好哦 813.1 Guarded Suspension模式 823.2 示例程序 82Request类 83RequestQueue类 84ClientThread类 85ServerThread类 85Main类 86java.util.Queue与java.util.LinkedList的操作 87getRequest详解 87putRequest详解 89synchronized的含义 89wait与锁 893.3 Guarded Suspension模式中的登场角色 903.4 拓展思路的要点 91附加条件的synchronized 91多线程版本的if 91忘记改变状态与生存性 91wait与notify/notifyAll的责任 [可复用性] 91各种称呼 91使用java.util.concurrent.LinkedBlockingQueue的示例程序 933.5 相关的设计模式 94Single Threaded Execution模式 94Balking模式 94Producer-Consumer模式 94Future模式 943.6 本章所学知识 953.7 练习题 95第4章 Balking模式——不需要就算了 994.1 Balking模式 1004.2 示例程序 100Data类 100SaverThread类 102ChangerThread类 102Main类 1034.3 Balking模式中的登场角色 1054.4 拓展思路的要点 106何时使用(可使用Balking模式的情况) 106balk结果的表示方式 1074.5 相关的设计模式 107Guarded Suspension模式 107Observer模式 1074.6 延伸阅读:超时 108Balking模式和Guarded Suspension模式之间 108wait何时终止呢 108guarded timed的实现(使用wait) 109synchronized中没有超时,也不能中断 110java.util.concurrent中的超时 1114.7 本章所学知识 1114.8 练习题 112第5章 Producer-Consumer模式——我来做,你来用 1155.1 Producer-Consumer模式 1165.2 示例程序 116Main类 116MakerThread类 117EaterThread类 118Table类 118解读put方法 120解读take方法 1215.3 Producer-Consumer模式中的登场角色 1225.4 拓展思路的要点 123守护安全性的Channel角色(可复用性) 123不可以直接传递吗 124Channel角色的剩余空间所导致的问题 124以什么顺序传递Data角色呢 125“存在中间角色”的意义 125Consumer角色只有一个时会怎么样呢 1265.5 相关的设计模式 126Mediator模式 126Worker Thread模式 126Command模式 126Strategy模式 1275.6 延伸阅读1:理解InterruptedException异常 127可能会花费时间,但可以取消 127加了throws InterruptedException的方法 127sleep方法和interrupt方法 128wait方法和interrupt方法 128join方法和interrupt方法 129interrupt方法只是改变中断状态 129isInterrupted方法——检查中断状态 130Thread.interrupted方法——检查并清除中断状态 130不可以使用Thread类的stop方法 1305.7 延伸阅读2:java.util.concurrent包和Producer-Consumer模式 131java.util.concurrent包中的队列 131使用java.util.concurrent.ArrayBlockingQueue的示例程序 132使用java.util.concurrent.Exchanger类交换缓冲区 1335.8 本章所学知识 1365.9 练习题 137第6章 Read-Write Lock模式——大家一起读没问题,但读的时候不要写哦 1416.1 Read-Write Lock模式 1426.2 示例程序 142Main类 143Data类 143WriterThread类 146ReaderThread类 146ReadWriteLock类 147执行起来看看 149守护条件的确认 1506.3 Read-Write Lock模式中的登场角色 1516.4 拓展思路的要点 153利用“读取”操作的线程之间不会冲突的特性来提高程序性能 153适合读取操作繁重时 153适合读取频率比写入频率高时 153锁的含义 1536.5 相关的设计模式 154Immutable模式 154Single Threaded Execution模式 154Guarded Suspension模式 154Before/After模式 154Strategized Locking模式 1546.6 延伸阅读:java.util.concurrent.locks包和Read-Write Lock模式 154java.util.concurrent.locks包 154使用java.util.concurrent.locks的示例程序 1556.7 本章所学知识 1566.8 练习题 157第7章 Thread-Per-Message模式——这项工作就交给你了 1637.1 Thread-Per-Message模式 1647.2 示例程序 164Main类 164Host类 165Helper类 1667.3 Thread-Per-Message模式中的登场角色 1687.4 拓展思路的要点 169提高响应性,缩短延迟时间 169适用于操作顺序没有要求时 169适用于不需要返回值时 169应用于服务器 169调用方法+启动线程→发送消息 1707.5 相关的设计模式 170Future模式 170Worker Thread模式 1707.6 延伸阅读1:进程与线程 1717.7 延伸阅读2:java.util.concurrent包和Thread-Per-Message模式 171java.lang.Thread类 171java.lang.Runnable接口 172java.util.concurrent.ThreadFactory接口 173java.util.concurrent.Executors类获取的ThreadFactory 174java.util.concurrent.Executor接口 175java.util.concurrent.ExecutorService接口 176java.util.concurrent.ScheduledExecutorService类 177总结 1787.8 本章所学知识 1807.9 练习题 180第8章 Worker Thread模式——工作没来就一直等,工作来了就干活 1878.1 Worker Thread模式 1888.2 示例程序 188Main类 189ClientThread类 190Request类 190Channel类 191WorkerThread类 1928.3 Worker Thread模式中的登场角色 1938.4 拓展思路的要点 195提高吞吐量 195容量控制 195调用与执行的分离 196Runnable接口的意义 197多态的Request角色 198独自一人的Worker角色 1998.5 相关的设计模式 199Producer-Consumer模式 199Thread-Per-Message模式 199Command模式 199Future模式 199Flyweight模式 199Thread-Specific Storage模式 200Active Ojbect模式 2008.6 延伸阅读1:Swing事件分发线程 200什么是事件分发线程 200事件分发线程只有一个 200事件分发线程调用监听器 201注册监听器的意义 201事件分发线程也负责绘制界面 201javax.swing.SwingUtilities类 202Swing的单线程规则 2038.7 延伸阅读2:java.util.concurrent包和Worker Thread模式 204ThreadPoolExecutor类 204通过java.util.concurrent包创建线程池 2058.8 本章所学知识 2078.9 练习题 208第9章 Future模式——先给您提货单 2119.1 Future模式 2129.2 示例程序 212Main类 214Host类 214Data接口 215FutureData类 216RealData类 2179.3 Future模式中的登场角色 2189.4 拓展思路的要点 219吞吐量会提高吗 219异步方法调用的“返回值” 220“准备返回值”和“使用返回值”的分离 220变种——不让主线程久等的Future角色 220变种——会发生变化的Future角色 221谁会在意多线程呢?“可复用性” 221回调与Future模式 2219.5 相关的设计模式 222Thread-Per-Message模式 222Builder模式 222Proxy模式 222Guarded Suspension模式 222Balking模式 2229.6 延伸阅读:java.util.concurrent包与Future模式 222java.util.concurrent包 222使用了java.util.concurrent包的示例程序 2239.7 本章所学知识 2269.8 练习题 226第10章 Two-Phase Termination模式——先收拾房间再睡觉 23110.1 Two-Phase Termination模式 23210.2 示例程序 233CountupThread类 234Main类 23610.3 Two-Phase Termination模式中的登场角色 23710.4 拓展思路的要点 238不能使用Thread类的stop方法 238仅仅检查标志是不够的 239仅仅检查中断状态是不够的 239在长时间处理前检查终止请求 239join方法和isAlive方法 240java.util.concurrent.ExecutorService接口与Two-Phase Termination模式 240要捕获程序整体的终止时 241优雅地终止线程 24310.5 相关的设计模式 243Before/After模式 243Multiphase Cancellation模式 243Multi-Phase Startup模式 244Balking模式 24410.6 延伸阅读1:中断状态与InterruptedException异常的相互转换 244中断状态→InterruptedException异常的转换 244InterruptedException异常→中断状态的转换 245InterruptedException异常→InterruptedException异常的转换 24510.7 延伸阅读2:java.util.concurrent包与线程同步 246java.util.concurrent.CountDownLatch类 246java.util.concurrent.CyclicBarrier类 24910.8 本章所学知识 25310.9 练习题 253第11章 Thread-Specific Storage模式——一个线程一个储物柜 26311.1 Thread-Specific Storage模式 26411.2 关于java.lang.ThreadLocal类 264java.lang.ThreadLocal就是储物间 264java.lang.ThreadLocal与泛型 26511.3 示例程序1:不使用Thread-Specific Storage模式的示例 265Log类 266Main类 26611.4 示例程序2:使用了Thread-Specific Storage模式的示例 267线程特有的TSLog类 268Log类 269ClientThread类 270Main类 27111.5 Thread-Specific Storage模式中的登场角色 27211.6 拓展思路的要点 274局部变量与java.lang.ThreadLocal类 274保存线程特有的信息的位置 275不必担心其他线程访问 275吞吐量的提高很大程序上取决于实现方式 276上下文的危险性 27611.7 相关的设计模式 277Singleton模式 277Worker Thread模式 277Single Threaded Execution模式 277Proxy模式 27711.8 延伸阅读:基于角色与基于任务 277主体与客体 277基于角色的考虑方式 278基于任务的考虑方式 278实际上两种方式是综合在一起的 27911.9 本章所学知识 27911.10 练习题 280第12章 Active Object模式——接收异步消息的主动对象 28312.1 Active Object模式 28412.2 示例程序1 284调用方:Main类 287调用方:MakerClientThread类 288调用方:DisplayClientThread类 289主动对象方:ActiveObject接口 289主动对象方:ActiveObjectFactory类 290主动对象方:Proxy类 290主动对象方:SchedulerThread类 291主动对象方:ActivationQueue类 292主动对象方:MethodRequest类 293主动对象方:MakeStringRequest类 294主动对象方:DisplayStringRequest类 295主动对象方:Result类 295主动对象方:FutureResult类 296主动对象方:RealResult类 296主动对象方:Servant类 297示例程序1的运行 29712.3 ActiveObject模式中的登场角色 29812.4 拓展思路的要点 304到底做了些什么事情 304运用模式时需要考虑问题的粒度 304关于并发性 304增加方法 305Scheduler角色的作用 305主动对象之间的交互 306通往分布式——从跨越线程界线变为跨越计算机界线 30612.5 相关的设计模式 306Producer-Consumer模式 306Future模式 307Worker Thread模式 307Thread-Specific Storage模式 30712.6 延伸阅读:java.util.concurrent包与Active Object模式 307类与接口 307调用方:Main类 309调用方:MakerClientThread类 309调用方:DisplayClientThread类 310主动对象方:ActiveObject接口 311主动对象方:ActiveObjectFactory类 311主动对象:ActiveObjectImpl类 312示例程序2的运行 31312.7 本章所学知识 31412.8 练习题 315第13章 总结——多线程编程的模式语言 32113.1 多线程编程的模式语言 322模式与模式语言 32213.2 Single Threaded Execution模式——能通过这座桥的只有一个人 32313.3 Immutable模式——想破坏也破坏不了 32413.4 Guarded Suspension模式——等我准备好哦 32513.5 Balking模式——不需要就算了 32613.6 Producer-Consumer模式——我来做,你来用 32713.7 Read-Write Lock模式——大家一起读没问题,但读的时候不要写哦 32813.8 Thread-Per-Message模式——这项工作就交给你了 32913.9 Worker Thread模式——工作没来就一直等,工作来了就干活 33013.10 Future模式——先给您提货单 33013.11 Two-Phase Termination模式——先收拾房间再睡觉 33113.12 Thread-Specific Storage模式——一个线程一个储物柜 33213.13 Active Object模式——接收异步消息的主动对象 33313.14 写在最后 335附录 337附录A 习题解答 338附录B Java内存模型 447附录C Java线程的优先级 467附录D 线程相关的主要API 469附录E java.util.concurrent包 475附录F 示例程序的运行步骤 483附录G 参考文献 485
评论关闭。