图灵程序设计丛书 图解Java多线程设计模式作者:结城浩 著;侯振龙,杨文轩 译出版时间:2017丛编项: 图灵程序设计丛书内容简介 本书通过具体的Java 程序,以浅显易懂的语言逐一说明了多线程和并发处理中常用的12 种设计模式。内容涉及线程的基础知识、线程的启动与终止、线程间的互斥处理与协作、线程的有效应用、线程的数量管理以及性能优化的注意事项等。此外,还介绍了一些多线程编程时容易出现的失误,以及多线程程序的阅读技巧等。在讲解过程中,不仅以图配文,理论结合实例,而且提供了运用模式解决具体问题的练习题和答案,帮助读者加深对多线程和并发处理的理解,并掌握其使用技巧。目录序章1/tJava线程/t1I1.1/tJava线程/t2I1.2/t何谓线程/t2明为跟踪处理流程,实为跟踪线程/t2单线程程序/t3多线程程序/t4Thread类的run方法和start方法/t5I1.3/t线程的启动/t9线程的启动(1)——利用Thread类的子类/t9线程的启动(2)——利用Runnable接口/t10I1.4/t线程的暂停/t12I1.5/t线程的互斥处理/t13synchronized方法/t14synchronized代码块/t17I1.6/t线程的协作/t18等待队列——线程休息室/t19wait方法——将线程放入等待队列/t19notify方法——从等待队列中取出线程/t21notifyAll方法——从等待队列中取出所有线程/t23wait、notify、notifyAll是Object类的方法/t24I1.7/t线程的状态迁移/t24I1.8/t线程相关的其他话题/t26I1.9/t本章所学知识/t26I1.10/t练习题/t26序章2/t多线程程序的评价标准/t31I2.1/t多线程程序的评价标准/t32安全性——不损坏对象/t32生存性——必要的处理能够被执行/t32可复用性——类可重复利用/t33性能——能快速、大批量地执行处理/t33评价标准总结/t33I2.2/t本章所学知识/t34I2.3/t练习题/t34第1章/tSingle Threaded Execution模式——能通过这座桥的只有一个人/t351.1/tSingle Threaded Execution模式/t361.2/t示例程序1:不使用Single Threaded Execution模式的程序/t36Main类/t37非线程安全的Gate类/t37UserThread类/t38执行起来看看……出错了/t39为什么会出错呢/t401.3/t示例程序2:使用Single Threaded Execution模式的程序/t41线程安全的Gate类/t41synchronized的作用/t421.4/tSingle Threaded Execution模式中的登场角色/t431.5/t拓展思路的要点/t44何时使用(可使用Single Threaded Execution模式的情况)/t44生存性与死锁/t45可复用性和继承反常/t46临界区的大小和性能/t461.6/t相关的设计模式/t47Guarded Suspension模式/t47Read-Write Lock模式/t47Immutable模式/t47Thread-Specific Storage模式/t481.7/t延伸阅读1:关于synchronized/t48synchronized语法与Before/After模式/t48synchronized在保护着什么/t49该以什么单位来保护呢/t50使用哪个锁保护/t50原子操作/t51long与double的操作不是原子的/t511.8/t延伸阅读2:java.util.concurrent包和计数信号量/t52计数信号量和Semaphore类/t52使用Semaphore类的示例程序/t521.9/t本章所学知识/t551.10/t练习题/t55第2章/tImmutable模式——想破坏也破坏不了/t612.1/tImmutable模式/t622.2/t示例程序/t62使用Immutable模式的Person类/t62Main类/t63PrintPersonThread类/t632.3/tImmutable模式中的登场角色/t652.4/t拓展思路的要点/t66何时使用(可使用Immutable模式的情况)/t66考虑成对的mutable类和immutable类 [性能]/t66为了确保不可变性 [可复用性]/t67标准类库中用到的Immutable模式/t672.5/t相关的设计模式/t69Single Threaded Execution模式/t69Read-Write Lock模式/t69Flyweight模式/t692.6/t延伸阅读1:final/t69final的含义/t692.7/t延伸阅读2:集合类与多线程/t71示例1:非线程安全的java.util.ArrayList类/t71示例2:利用Collections.synchronizedList方法所进行的同步/t74示例3:使用copy-on-write的java.util.concurrent.CopyOnWriteArrayList类/t752.8/t本章所学知识/t762.9/t练习题/t77第3章/tGuarded Suspension模式——等我准备好哦/t813.1/tGuarded Suspension模式/t823.2/t示例程序/t82Request类/t83RequestQueue类/t84ClientThread类/t85ServerThread类/t85Main类/t86java.util.Queue与java.util.LinkedList的操作/t87getRequest详解/t87putRequest详解/t89synchronized的含义/t89wait与锁/t893.3/tGuarded Suspension模式中的登场角色/t903.4/t拓展思路的要点/t91附加条件的synchronized/t91多线程版本的if/t91忘记改变状态与生存性/t91wait与notify/notifyAll的责任 [可复用性]/t91各种称呼/t91使用java.util.concurrent.LinkedBlockingQueue的示例程序/t933.5/t相关的设计模式/t94Single Threaded Execution模式/t94Balking模式/t94Producer-Consumer模式/t94Future模式/t943.6/t本章所学知识/t953.7/t练习题/t95第4章/tBalking模式——不需要就算了/t994.1/tBalking模式/t1004.2/t示例程序/t100Data类/t100SaverThread类/t102ChangerThread类/t102Main类/t1034.3/tBalking模式中的登场角色/t1054.4/t拓展思路的要点/t106何时使用(可使用Balking模式的情况)/t106balk结果的表示方式/t1074.5/t相关的设计模式/t107Guarded Suspension模式/t107Observer模式/t1074.6/t延伸阅读:超时/t108Balking模式和Guarded Suspension模式之间/t108wait何时终止呢/t108guarded timed的实现(使用wait)/t109synchronized中没有超时,也不能中断/t110java.util.concurrent中的超时/t1114.7 本章所学知识/t1114.8 练习题/t112第5章/tProducer-Consumer模式——我来做,你来用/t1155.1/tProducer-Consumer模式/t1165.2/t示例程序/t116Main类/t116MakerThread类/t117EaterThread类/t118Table类/t118解读put方法/t120解读take方法/t1215.3/tProducer-Consumer模式中的登场角色/t1225.4/t拓展思路的要点/t123守护安全性的Channel角色(可复用性)/t123不可以直接传递吗/t124Channel角色的剩余空间所导致的问题/t124以什么顺序传递Data角色呢/t125“存在中间角色”的意义/t125Consumer角色只有一个时会怎么样呢/t1265.5/t相关的设计模式/t126Mediator模式/t126Worker Thread模式/t126Command模式/t126Strategy模式/t1275.6/t延伸阅读1:理解InterruptedException异常/t127可能会花费时间,但可以取消/t127加了throws InterruptedException的方法/t127sleep方法和interrupt方法/t128wait方法和interrupt方法/t128join方法和interrupt方法/t129interrupt方法只是改变中断状态/t129isInterrupted方法——检查中断状态/t130Thread.interrupted方法——检查并清除中断状态/t130不可以使用Thread类的stop方法/t1305.7/t延伸阅读2:java.util.concurrent包和Producer-Consumer模式/t131java.util.concurrent包中的队列/t131使用java.util.concurrent.ArrayBlockingQueue的示例程序/t132使用java.util.concurrent.Exchanger类交换缓冲区/t1335.8/t本章所学知识/t1365.9/t练习题/t137第6章/tRead-Write Lock模式——大家一起读没问题,但读的时候不要写哦/t1416.1/tRead-Write Lock模式/t1426.2/t示例程序/t142Main类/t143Data类/t143WriterThread类/t146ReaderThread类/t146ReadWriteLock类/t147执行起来看看/t149守护条件的确认/t1506.3/tRead-Write Lock模式中的登场角色/t1516.4/t拓展思路的要点/t153利用“读取”操作的线程之间不会冲突的特性来提高程序性能/t153适合读取操作繁重时/t153适合读取频率比写入频率高时/t153锁的含义/t1536.5/t相关的设计模式/t154Immutable模式/t154Single Threaded Execution模式/t154Guarded Suspension模式/t154Before/After模式/t154Strategized Locking模式/t1546.6/t延伸阅读:java.util.concurrent.locks包和Read-Write Lock模式/t154java.util.concurrent.locks包/t154使用java.util.concurrent.locks的示例程序/t1556.7/t本章所学知识/t1566.8/t练习题/t157第7章/tThread-Per-Message模式——这项工作就交给你了/t1637.1/tThread-Per-Message模式/t1647.2/t示例程序/t164Main类/t164Host类/t165Helper类/t1667.3/tThread-Per-Message模式中的登场角色/t1687.4/t拓展思路的要点/t169提高响应性,缩短延迟时间/t169适用于操作顺序没有要求时/t169适用于不需要返回值时/t169应用于服务器/t169调用方法+启动线程→发送消息/t1707.5/t相关的设计模式/t170Future模式/t170Worker Thread模式/t1707.6/t延伸阅读1:进程与线程/t1717.7/t延伸阅读2:java.util.concurrent包和Thread-Per-Message模式/t171java.lang.Thread类/t171java.lang.Runnable接口/t172java.util.concurrent.ThreadFactory接口/t173java.util.concurrent.Executors类获取的ThreadFactory/t174java.util.concurrent.Executor接口/t175java.util.concurrent.ExecutorService接口/t176java.util.concurrent.ScheduledExecutorService类/t177总结/t1787.8/t本章所学知识/t1807.9/t练习题/t180第8章/tWorker Thread模式——工作没来就一直等,工作来了就干活/t1878.1/tWorker Thread模式/t1888.2/t示例程序/t188Main类/t189ClientThread类/t190Request类/t190Channel类/t191WorkerThread类/t1928.3/tWorker Thread模式中的登场角色/t1938.4/t拓展思路的要点/t195提高吞吐量/t195容量控制/t195调用与执行的分离/t196Runnable接口的意义/t197多态的Request角色/t198独自一人的Worker角色/t1998.5/t相关的设计模式/t199Producer-Consumer模式/t199Thread-Per-Message模式/t199Command模式/t199Future模式/t199Flyweight模式/t199Thread-Specific Storage模式/t200Active Ojbect模式/t2008.6/t延伸阅读1:Swing事件分发线程/t200什么是事件分发线程/t200事件分发线程只有一个/t200事件分发线程调用监听器/t201注册监听器的意义/t201事件分发线程也负责绘制界面/t201javax.swing.SwingUtilities类/t202Swing的单线程规则/t2038.7/t延伸阅读2:java.util.concurrent包和Worker Thread模式/t204ThreadPoolExecutor类/t204通过java.util.concurrent包创建线程池/t2058.8/t本章所学知识/t2078.9/t练习题/t208第9章/tFuture模式——先给您提货单/t2119.1/tFuture模式/t2129.2/t示例程序/t212Main类/t214Host类/t214Data接口/t215FutureData类/t216RealData类/t2179.3/tFuture模式中的登场角色/t2189.4/t拓展思路的要点/t219吞吐量会提高吗/t219异步方法调用的“返回值”/t220“准备返回值”和“使用返回值”的分离/t220变种——不让主线程久等的Future角色/t220变种——会发生变化的Future角色/t221谁会在意多线程呢?“可复用性”/t221回调与Future模式/t2219.5/t相关的设计模式/t222Thread-Per-Message模式/t222Builder模式/t222Proxy模式/t222Guarded Suspension模式/t222Balking模式/t2229.6/t延伸阅读:java.util.concurrent包与Future模式/t222java.util.concurrent包/t222使用了java.util.concurrent包的示例程序/t2239.7/t本章所学知识/t2269.8/t练习题/t226第10章/tTwo-Phase Termination模式——先收拾房间再睡觉/t23110.1/tTwo-Phase Termination模式/t23210.2/t示例程序/t233CountupThread类/t234Main类/t23610.3/tTwo-Phase Termination模式中的登场角色/t23710.4/t拓展思路的要点/t238不能使用Thread类的stop方法/t238仅仅检查标志是不够的/t239仅仅检查中断状态是不够的/t239在长时间处理前检查终止请求/t239join方法和isAlive方法/t240java.util.concurrent.ExecutorService接口与Two-Phase Termination模式/t240要捕获程序整体的终止时/t241优雅地终止线程/t24310.5/t相关的设计模式/t243Before/After模式/t243Multiphase Cancellation模式/t243Multi-Phase Startup模式/t244Balking模式/t24410.6/t延伸阅读1:中断状态与InterruptedException异常的相互转换/t244中断状态→InterruptedException异常的转换/t244InterruptedException异常→中断状态的转换/t245InterruptedException异常→InterruptedException异常的转换/t24510.7/t延伸阅读2:java.util.concurrent包与线程同步/t246java.util.concurrent.CountDownLatch类/t246java.util.concurrent.CyclicBarrier类/t24910.8/t本章所学知识/t25310.9/t练习题/t253第11章/tThread-Specific Storage模式——一个线程一个储物柜/t26311.1/tThread-Specific Storage模式/t26411.2/t关于java.lang.ThreadLocal类/t264java.lang.ThreadLocal就是储物间/t264java.lang.ThreadLocal与泛型/t26511.3/t示例程序1:不使用Thread-Specific Storage模式的示例/t265Log类/t266Main类/t26611.4/t示例程序2:使用了Thread-Specific Storage模式的示例/t267线程特有的TSLog类/t268Log类/t269ClientThread类/t270Main类/t27111.5/tThread-Specific Storage模式中的登场角色/t27211.6/t拓展思路的要点/t274局部变量与java.lang.ThreadLocal类/t274保存线程特有的信息的位置/t275不必担心其他线程访问/t275吞吐量的提高很大程序上取决于实现方式/t276上下文的危险性/t27611.7/t相关的设计模式/t277Singleton模式/t277Worker Thread模式/t277Single Threaded Execution模式/t277Proxy模式/t27711.8 延伸阅读:基于角色与基于任务/t277主体与客体/t277基于角色的考虑方式/t278基于任务的考虑方式/t278实际上两种方式是综合在一起的/t27911.9/t本章所学知识/t27911.10/t练习题/t280第12章/tActive Object模式——接收异步消息的主动对象/t28312.1/tActive Object模式/t28412.2/t示例程序1/t284调用方:Main类/t287调用方:MakerClientThread类/t288调用方:DisplayClientThread类/t289主动对象方:ActiveObject接口/t289主动对象方:ActiveObjectFactory类/t290主动对象方:Proxy类/t290主动对象方:SchedulerThread类/t291主动对象方:ActivationQueue类/t292主动对象方:MethodRequest类/t293主动对象方:MakeStringRequest类/t294主动对象方:DisplayStringRequest类/t295主动对象方:Result类/t295主动对象方:FutureResult类/t296主动对象方:RealResult类/t296主动对象方:Servant类/t297示例程序1的运行/t29712.3/tActiveObject模式中的登场角色/t29812.4/t拓展思路的要点/t304到底做了些什么事情/t304运用模式时需要考虑问题的粒度/t304关于并发性/t304增加方法/t305Scheduler角色的作用/t305主动对象之间的交互/t306通往分布式——从跨越线程界线变为跨越计算机界线/t30612.5/t相关的设计模式/t306Producer-Consumer模式/t306Future模式/t307Worker Thread模式/t307Thread-Specific Storage模式/t30712.6/t延伸阅读:java.util.concurrent包与Active Object模式/t307类与接口/t307调用方:Main类/t309调用方:MakerClientThread类/t309调用方:DisplayClientThread类/t310主动对象方:ActiveObject接口/t311主动对象方:ActiveObjectFactory类/t311主动对象:ActiveObjectImpl类/t312示例程序2的运行/t31312.7/t本章所学知识/t31412.8/t练习题/t315第13章/t总结——多线程编程的模式语言/t32113.1/t多线程编程的模式语言/t322模式与模式语言/t32213.2/tSingle Threaded Execution模式/t——能通过这座桥的只有一个人/t32313.3 Immutable模式/t——想破坏也破坏不了/t32413.4 Guarded Suspension模式/t——等我准备好哦/t32513.5 Balking模式/t——不需要就算了/t32613.6 Producer-Consumer模式/t——我来做,你来用/t32713.7 Read-Write Lock模式/t——大家一起读没问题,但读的时候不要写哦/t32813.8 Thread-Per-Message模式/t——这项工作就交给你了/t32913.9 Worker Thread模式/t——工作没来就一直等,工作来了就干活/t33013.10/tFuture模式/t——先给您提货单/t33013.11/tTwo-Phase Termination模式/t——先收拾房间再睡觉/t33113.12/tThread-Specific Storage模式/t——一个线程一个储物柜/t33213.13/tActive Object模式/t——接收异步消息的主动对象/t33313.14/t写在最后/t335附录/t/t337附录A 习题解答/t338附录B Java内存模型/t447附录C Java线程的优先级/t467附录D 线程相关的主要API/t469附录E java.util.concurrent包/t475附录F 示例程序的运行步骤/t483附录G 参考文献/t485 上一篇: 信息科学与技术丛书 Linux驱动程序开发实例 (第2版) 下一篇: JAVA程序员面试宝典 第4版 [欧立奇,朱梅,段韬 编著]