具体描述
编辑推荐
适读人群 :本书适合有一定基础的Java程序员阅读学习,尤其适合想要掌握Java线程和并发工具的读者阅读参考。
Java的线程API和并发工具类,是Java自身强大而富有挑战性的API及语言特性的一部分。Java新手往
往很难用这些特性编写出正确的多线程应用程序。本书旨在帮助Java开发者掌握并高效地使用这些功能。
本书分为两个部分,每部分包含4个章节。 第1部分关注于底层的线程API,而第2部分则关注于高级的并发工具类。第1部分介绍线程API的基础知识、同步、等待 通知以及线程组的额外能力,还有线程局部变量和定时器框架。第2部分介绍并发工具类的基础知识、Executor、同步器、锁框架,以及并发集合的额外能力、原子变量、Fork Join框架和Completion Service。
每一章节后都给出了一些练习题。这些练习题旨在测试你对章节内容的理解程度。附录A提供这些习题的答案。附录B介绍了如何在Swing图形用户接口工具集(Swing Graphical User Interface Tookit)中使用线程。
通过本书,你将学习:
● 创建、配置并启动运行runnable的线程;
● 同步共享代码以避免竞态条件、数据竞争以及
其他并发问题;
● 避免缓存变量引发的问题;
● 使用等待 通知机制协调多条线程;
● 探索线程组并学习避免使用它们的原因;
● 学习线程局部变量;
● 探索定时器框架;
● 学习引入并发工具类的原因;
● 探索Executor、同步器以及锁框架;
● 探索并发集合、原子变量、Fork Join框架以及
Completion Service;
● 实验Sw i ng中的线程使用方式及其线程相关的
API。 内容简介
Java线程和并发工具是应用开发中的重要部分,备受开发者的重视,也有一定的学习难度。
《Java线程与并发编程实践》是针对Java 8中的线程特性和并发工具的快速学习和实践指南。全书共8章,分别介绍了Thread类和Runnable接口、同步、等待和通知、线程组、定时器框架、并发工具、同步器、锁框架,以及高级并发工具等方面的主题。每章的末尾都以练习题的方式,帮助读者巩固所学的知识。附录A给出了所有练习题的解答,附录B给出了一个基于Swing线程的教程。
《Java线程与并发编程实践》适合有一定基础的Java程序员阅读学习,尤其适合想要掌握Java线程和并发工具的读者阅读参考。 作者简介
Jeff Friesen既是一名自由职业的家教也是重点关注于Java的软件开发者。除了是《Learn Java for Android Development》一书的作者以及《Android Recipes》一书的合著人,Jeff还给JavaWorld(JavaWorld.com)、informIT(InformIT.com)、Java.net以及DevSource(Devsource.com)写了大量关于Java及其它技术的文章。你可以通过他的个人网站TutorTutor.ca联系他。 目录
第一部分 线程API
第1章 Thread和Runnable 2
1.1 Thread和Runnable简介 2
1.1.1 创建Thread和Runnable对象 3
1.1.2 获取和设置线程状态 4
1.1.3 获取和设置线程的名称 5
1.1.4 获取一条线程的存活状态 5
1.1.5 获取一条线程的执行状态 6
1.1.6 获取和设置线程的优先级 6
1.1.7 获取和设置线程的守护线程状态 8
1.1.8 启动线程 9
1.2 操作更高级的线程任务 12
1.2.1 中断线程 12
1.2.2 等待线程 16
1.2.3 线程睡眠 20
1.3 练习 23
1.4 小结 24
第2章 同步 26
2.1 线程中的问题 26
2.1.1 竞态条件 26
2.1.2 缓存变量 29
2.2 同步临界区的访问 30
2.2.1 使用同步方法 32
2.2.2 使用同步块 33
2.3 谨防活跃性问题 34
2.4 Volatile和Final变量 39
2.5 练习 48
2.6 小结 50
第3章 等待和通知 52
3.1 等待 通知API一览 52
3.2 生产者和消费者 55
3.3 练习 65
3.4 小结 66
第4章 额外的线程能力 67
4.1 线程组 67
4.2 线程局部变量 73
4.3 定时器框架 77
4.3.1 深入Timer 81
4.3.2 深入TimerTask 85
4.4 练习 87
4.5 小结 88
第二部分 并发工具类
第5章 并发工具类和Executor框架 90
5.1 探索Executor 91
5.2 练习 103
5.3 小结 105
第6章 同步器 106
6.1 倒计时门闩 106
6.2 同步屏障 111
6.3 交换器 119
6.4 信号量 126
6.5 信号量和公平策略 127
6.6 Phaser 136
6.7 练习 139
6.8 小结 140
第7章 锁框架 142
同步及低级别的锁 142
7.1 锁 143
7.2 重入锁 145
7.3 条件 149
7.4 读写锁 157
7.5 重入读写锁 158
7.6 练习 165
7.7 小结 166
第8章 额外的并发工具类 167
8.1 并发集合 167
8.1.1 使用BlockingQueue和ArrayBlockingQueue 169
8.1.2 深入学习ConcurrentHashMap 172
8.2 原子变量 173
8.3 Fork Join框架 179
8.4 Completion Service 190
8.5 练习 194
8.6 小结 196
第三部分 附录
附录A 练习题答案 198
第1章:Thread和Runnable 198
第2章:同步 201
第3章:等待和通知 205
第4章:额外的线程能力 208
第5章:并发工具类和Executor框架 211
第6章:同步器 215
第7章:锁框架 220
第8章:额外的并发工具 222
附录B Swing中的线程 225
单线程编程模型 225
线程化API 231
SwingUtilities和EventQueue 231
SwingWorker 240
定时器 245
基于定时器的幻灯片展示 249
《Java线程与并发编程实践》:解锁多核时代的效率密码 在这个信息爆炸、数据洪流的时代,软件的性能和响应速度已成为衡量其质量的关键指标。而“并发”——让程序在同一时间处理多个任务的能力——正是实现这一目标的核心技术。无论是搭建高并发的Web服务器,设计高效的分布式系统,还是优化复杂的算法,深入理解和掌握并发编程都是不可或缺的技能。 《Java线程与并发编程实践》并非仅仅是一本介绍Java API的教程,它更是一本为你打开多核时代效率大门的钥匙。本书致力于为开发者提供一套系统、深入且极具实践性的并发编程知识体系,让你能够自信地驾驭Java中的多线程世界,写出健壮、高效、可扩展的并发应用程序。 本书将从最基础的概念入手,层层递进,带你领略并发编程的精妙之处: 第一部分:并发的基石——线程的生命周期与管理 在深入探讨复杂的并发模型之前,我们首先需要建立起对线程最基本、最牢固的认识。本书将详细剖析Java线程的完整生命周期:从新生(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)到终止(Terminated)。你将理解线程在不同状态之间是如何转换的,以及导致这些转换的内在机制。 线程的创建与启动: 除了传统的`Thread`类继承和`Runnable`接口实现方式,本书还会探讨更现代、更灵活的线程创建策略,并深入分析`start()`方法与`run()`方法的本质区别,让你深刻理解线程的真正启动过程。 线程的调度: 理解Java虚拟机的线程调度策略至关重要。我们将解析优先级调度、时间片轮转等概念,并讲解如何通过设置线程优先级来影响其执行顺序(尽管不建议过度依赖)。 线程的同步与协作: 当多个线程需要访问共享资源时,同步就显得尤为重要。本书将详细介绍`synchronized`关键字的工作原理,包括对象锁、类锁以及如何避免死锁。此外,我们还将深入讲解`wait()`, `notify()`, `notifyAll()`这组强大的协作工具,让你能够设计出线程间精妙的通信机制。 线程的终止: 优雅地终止线程是编写健壮并发程序的关键。本书将教你如何通过标志位、中断等方式安全地停止线程,避免资源泄露和不确定的行为。 第二部分:并发工具箱——JDK并发包的深入探索 Java 5引入的`java.util.concurrent`(JUC)包是并发编程的利器,它提供了一系列预构建的高效并发工具,极大地简化了并发编程的复杂性。本书将带领你逐一剖析这些工具的强大功能和底层实现。 执行器框架(Executor Framework): 告别手动创建和管理线程的繁琐。我们将深入讲解`ExecutorService`接口,以及`ThreadPoolExecutor`等常用线程池的配置与调优。你将学会如何根据应用场景选择合适的线程池类型,并理解线程池复用线程、管理任务的原理,从而显著提升系统吞吐量和资源利用率。 并发集合(Concurrent Collections): 传统的`java.util`集合在多线程环境下存在线程安全问题。本书将详细介绍`ConcurrentHashMap`, `CopyOnWriteArrayList`, `BlockingQueue`等并发集合的特性,分析它们是如何在不使用显式锁的情况下实现线程安全的,以及它们在各种场景下的性能优势。 同步器(Synchronizers): JUC包提供了比`synchronized`更灵活、更强大的同步原语。我们将深入讲解`CountDownLatch`, `CyclicBarrier`, `Semaphore`, `Phaser`等同步器的用法,以及它们在实现复杂并发场景,如任务编排、资源限流等方面的应用。 原子变量(Atomic Variables): 对于简单的数值操作,使用锁会带来不必要的开销。本书将介绍`AtomicInteger`, `AtomicLong`, `AtomicReference`等原子类,以及它们基于CAS(Compare-and-Swap)操作实现的无锁原子更新,帮助你编写出更高效的并发代码。 并发的锁(Locks): `java.util.concurrent.locks`包提供了比`synchronized`更丰富的锁机制。我们将详细讲解`ReentrantLock`, `ReentrantReadWriteLock`, `StampedLock`等锁的特性,以及如何使用它们来精细化地控制锁的获取和释放,解决死锁问题,提高并发性能。 第三部分:并发设计模式与高级主题 掌握了并发工具,我们还需要学习如何将它们巧妙地组合起来,形成健壮的并发设计。本书将深入探讨一系列经典的并发设计模式,并触及更高级的并发议题。 线程安全的设计原则: 讲解无状态对象、不可变对象、线程局部存储(ThreadLocal)等设计思想,以及如何通过这些原则从源头上避免线程安全问题。 并发设计模式: 深入剖析如生产者-消费者模式、读写锁模式、单例模式(在并发环境下的实现)、Future模式、Guarded Suspension模式等经典并发设计模式,并结合实际代码案例进行演示,帮助你理解这些模式的适用场景和实现细节。 并发的性能调优: 性能是并发编程的核心追求。本书将指导你如何识别并发瓶颈,分析死锁、活锁、饥饿等问题,并提供一套系统性的性能调优方法论,包括线程池参数调优、锁的粒度控制、缓存一致性等。 JVM与并发: 了解JVM在线程管理和内存模型上的行为是深入理解并发的关键。我们将探讨JVM的内存模型(Java Memory Model, JMM),分析happens-before原则,以及垃圾回收(GC)在并发环境下的影响。 并发的测试与调试: 编写并发程序容易出错,测试和调试也更具挑战性。本书将介绍各种并发测试技术,包括单元测试、压力测试、以及如何利用JVM提供的工具(如jstack, jmap, JConsole, VisualVM)进行并发程序的调试。 谁适合阅读本书? Java初学者: 希望在学习Java的同时,提前建立对并发编程的正确认知,避免日后踩坑。 中级Java开发者: 已经接触过多线程,但对并发原理、JUC包的使用和线程安全问题仍感困惑,希望系统提升并发编程能力。 高级Java开发者/架构师: 需要深入理解并发的底层机制,掌握高级并发设计模式,以构建高性能、高可用的分布式系统。 对性能优化感兴趣的开发者: 想要了解如何通过并发技术提升应用程序的响应速度和吞吐量。 《Java线程与并发编程实践》不是一本速成手册,它是一段探索之旅。 我们鼓励读者在阅读过程中,勤于思考,动手实践,通过大量的代码示例来加深理解。本书所提供的知识和技能,将帮助你信心百倍地应对多核时代的挑战,写出优雅、高效、稳健的Java并发程序。 让你在每一次的并发编程实践中,都能游刃有余,成为一名真正的多线程“玩家”。