具体描述
作 者:高洪岩 著 定 价:69 出 版 社:机械工业出版社 出版日期:2015年06月01日 页 数:306 装 帧:平装 ISBN:9787111502067 ●前言
●第1章 Java多线程技能 1
●1.1 进程和多线程的概念及线程的优点 1
●1.2 使用多线程 3
●1.2.1 继承Thread类 4
●1.2.2 实现Runnable接口 8
●1.2.3 实例变量与线程安全 9
●1.2.4 留意i--与System.out.println()的异常 14
●1.3 currentThread()方法 16
●1.4 isAlive()方法 18
●1.5 sleep()方法 20
●1.6 getId()方法 22
●1.7 停止线程 23
●1.7.1 停止不了的线程 23
●1.7.2 判断线程是否是停止状态 24
●1.7.3 能停止的线程——异常法 27
●1.7.4 在沉睡中停止 30
●1.7.5 能停止的线程——暴力停止 32
●1.7.6 方法stop()与java.lang.ThreadDeath异常 33
●1.7.7 释放锁的不良后果 34
●部分目录
内容简介
全书共7章。靠前章讲解了Java多线程的基础,重点介绍线程类的核心API的使用。第2章讲解对并发访问的控制,即如何写出线程安全的程序。第3章介绍线程间通信,以提高CPU利用率和系统间的交互,同时增强对线程任务的把控与监督。第4章讲解Lock对象,以更好实现并发访问时的同步处理。第5章讲解移动开发中使用较多的定时器类的多线程技术,这是计划/任务执行里很重要的技术点。第6章讲解如何安全、正确地将单例模式与多线程技术相结合,避免实际应用中可能会出现的麻烦。第7章将前面被遗漏的案例在本章节中进行补充,尽量做到不出现技术空白点。 高洪岩 著 高洪岩,某世界500强企业不错项目经理,10余年项目管理与开发经验,10年Java相关开发经验。 Preface?前 言为什么要写这本书早在几年前笔者就曾想过整理一份与Java多线程有关的稿件,因为市面上所有的Java书籍都是以一章或两章的篇幅介绍多线程技术,并没有完整地覆盖该技术的知识点,但可惜,苦于当时的时间及精力有限,一直没有达成所愿。
也许是注定的安排,我目前所在的单位是集技术与教育为一体的软件类企业。我在工作中发现很多学员在学习完JavaSE/JavaEE之后想对更深入的技术进行探索,比如在对大数据、分布式、高并发类的专题进行攻克时,立即遇到针对java.lang包中Thread类的学习,但Thread类的学习并不像JDBC那样简单,学习多线程会遇到太多的问题、弯路以及我们所谓的“坑”,为了带领学员在技术层面上进行更高的追求,我将多线程的技术点以教案的方式进行整理,在课堂上与等
《深入理解 Java 异步与并发模型》 引言: 在当今高度互联、对响应速度和吞吐量要求极高的软件开发领域,并发编程早已不是锦上添花的技术,而是构建高性能、可伸缩应用程序的基石。从服务器端的处理海量请求,到桌面应用的流畅用户体验,再到嵌入式系统对资源的高效利用,无处不见并发的身影。然而,并发编程的复杂性也如同一把双刃剑,稍有不慎,便可能导致难以追踪的死锁、竞态条件,甚至数据损坏,给项目的稳定性和开发者的信心带来巨大挑战。 本书《深入理解 Java 异步与并发模型》正是为了应对这一挑战而生。它并非浅尝辄止地介绍 Java 并发API的使用,而是旨在带领读者深入剖析 Java 虚拟机(JVM)层面以及 Java 语言层面提供的强大并发机制。我们相信,只有深刻理解这些底层原理,才能真正掌握并发编程的精髓,写出既高效又健壮的并发代码。本书将带领您穿越 Java 并发世界的迷雾,构建坚实的理论基础,掌握实用的设计模式,并最终成为一名出色的并发程序设计者。 本书内容概述: 本书将从并发编程最基础的概念出发,逐步深入到 JVM 和 Java 内存模型的核心。我们将重点关注 Java 提供的各种同步机制,分析它们的适用场景和工作原理,并探讨如何利用这些工具来解决实际的并发问题。此外,本书还将详细介绍 Java 并发库(`java.util.concurrent`)的强大功能,包括各种 Executor 框架、并发集合、同步器以及原子变量等,并展示如何通过它们来构建更简洁、更高效的并发解决方案。 第一部分:并发编程基础与 Java 内存模型 第一章:并发编程的基石——线程的创建与生命周期 深入理解线程的概念:进程与线程的区别与联系,用户线程与守护线程。 多种线程创建方式的剖析:`Thread` 类,`Runnable` 接口,`Callable` 接口与 `Future`。 线程生命周期的详尽解析:新建、就绪、运行、阻塞、终止,以及各种状态转换的细节。 线程的优先级与时间片的概念,以及它们在线程调度中的作用。 线程中断机制的原理与应用:`interrupt()` 方法,`isInterrupted()` 和 `interrupted()` 的区别,中断标志的处理。 线程同步的初步认识:线程安全的概念,为什么需要同步。 第二章:Java 内存模型(JMM)——并发的灵魂 从硬件层面理解内存模型:CPU 缓存、写缓冲区、乱序执行。 Java 内存模型(JMM)的规范:主内存与工作内存。 原子性、可见性、有序性:这三个核心概念在 JMM 中的体现。 `volatile` 关键字的深入剖析:如何实现可见性和禁止指令重排,`volatile` 与 `synchronized` 的区别。 `happens-before` 原则:理解 Java 内存模型中指令执行顺序的保障。 内存屏障(Memory Barriers)的作用:JVM 如何通过内存屏障来确保指令的有序性。 JMM 对各种原子操作的规定:`read`, `load`, `use`, `assign`, `store`, `write`。 JMM 与 C++ 内存模型,以及不同 CPU 架构下的差异。 第二部分:Java 的同步机制与线程通信 第三章:锁机制——控制并发访问的利器 `synchronized` 关键字的原理:底层实现(Monitor),对象头,锁升级(无锁、偏向锁、轻量级锁、重量级锁)。 `synchronized` 的作用域:方法锁与代码块锁。 `synchronized` 的局限性:性能问题,不可中断的阻塞。 `ReentrantLock` 详解:与 `synchronized` 的对比,非阻塞获取锁,公平锁与非公平锁。 `ReentrantReadWriteLock`:读写分离的优化,读锁与写锁的特点。 中断性的锁获取:`tryLock()` 方法,`lockInterruptibly()` 方法。 条件变量(`Condition`):`await()`, `signal()`, `signalAll()`,如何实现更灵活的线程间通信。 第四章:线程通信——共享数据与协调工作 `wait()`、`notify()`、`notifyAll()` 的原理与使用场景:基于 `synchronized` 的线程间通信。 `wait()`、`notify()`、`notifyAll()` 的注意事项:必须在 `synchronized` 块中调用,避免虚假唤醒。 管程(Monitor)模型:`wait()`、`notify()`、`notifyAll()` 的底层实现。 生产者-消费者模式的实现:使用 `wait()` 和 `notifyAll()`。 `volatile` 在线程通信中的作用:保证可见性,但不提供原子性。 `PipedInputStream` 和 `PipedOutputStream`:面向字节流的线程通信。 第三部分:Java 并发库 (`java.util.concurrent`) 的精髓 第五章:Executor 框架——线程池的强大管理 线程池的优势:提高性能,降低资源消耗,便于线程管理。 `Executor` 接口与 `ExecutorService` 接口。 `ThreadPoolExecutor`:核心参数解析(`corePoolSize`, `maximumPoolSize`, `keepAliveTime`, `workQueue`, `threadFactory`, `handler`)。 常见的 `ExecutorService` 实现: `FixedThreadPool`:固定数量线程的线程池。 `CachedThreadPool`:可伸缩的线程池。 `ScheduledThreadPool`:定时与周期性任务执行的线程池。 `SingleThreadExecutor`:单线程的线程池。 任务的提交:`execute()` 与 `submit()`,`Future` 与 `Callable`。 线程池的关闭:`shutdown()` 与 `shutdownNow()`,优雅关闭。 线程池的拒绝策略:`AbortPolicy`, `CallerRunsPolicy`, `DiscardPolicy`, `DiscardOldestPolicy`。 第六章:并发集合——安全高效的数据结构 `java.util.concurrent.Concurrent` 包的介绍。 `ConcurrentHashMap` 详解:与 `HashTable` 和 `synchronizedMap` 的对比,分段锁与 CAS 操作。 `CopyOnWriteArrayList` 与 `CopyOnWriteArraySet`:写时复制的原理与适用场景,对迭代器的影响。 `BlockingQueue` 接口:阻塞队列的概念,用于解耦生产者和消费者。 `ArrayBlockingQueue`, `LinkedBlockingQueue`, `PriorityBlockingQueue`, `SynchronousQueue`, `DelayQueue`。 `BlockingDeque` 接口。 `ConcurrentLinkedQueue`:基于 CAS 的非阻塞链表队列。 第七章:同步器 (`java.util.concurrent.locks`)——高级并发控制 `CountDownLatch`:一次性倒计时的同步器,用于等待一组事件完成。 `CyclicBarrier`:可重复使用的屏障,用于等待一组线程到达某个同步点。 `Semaphore`:信号量,用于限制并发访问的线程数量。 `Exchanger`:用于两个线程之间交换数据的同步器。 `Phaser`:更灵活的 `CyclicBarrier`,支持动态注册和移除 parties。 `AbstractQueuedSynchronizer` (AQS):Java 并发锁的核心框架,理解 `ReentrantLock` 等的底层实现。 第八章:原子变量 (`java.util.concurrent.atomic`)——无锁并发操作 原子操作的概念:不可中断的操作。 CAS (Compare-and-Swap) 操作:原子变量实现的基础。 `AtomicInteger`, `AtomicLong`, `AtomicBoolean`:基本类型的原子类。 `AtomicReference`:引用类型的原子类。 `AtomicStampedReference`:解决 CAS 的 ABA 问题。 `AtomicIntegerArray`, `AtomicLongArray`, `AtomicReferenceArray`:数组的原子类。 原子变量的性能优势与适用场景。 第四部分:并发设计模式与高级主题 第九章:并发设计模式——构建健壮的并发系统 不可变对象:如何通过设计来避免并发问题。 线程局部变量 (`ThreadLocal`):隔离线程间的数据。 对象池 (Object Pool):提高资源利用率。 生产者-消费者模式 (Producer-Consumer):经典的多线程协作模式。 读写锁模式 (Read-Write Lock):优化读多写少的场景。 双重检查锁 (Double-Checked Locking):实现单例模式的常见但易出错的模式。 Guarded Suspension (守护暂停):等待条件满足。 Balking (犹豫):避免重复执行。 Worker Thread (工作线程):异步执行任务。 第十章:并发下的异常处理与性能优化 并发程序中的常见异常:`NullPointerException`, `ArrayIndexOutOfBoundsException`, `ClassCastException` 等如何在并发环境下触发。 线程死锁的检测与避免:死锁的四个必要条件,如何预防。 竞态条件 (Race Condition):如何识别和解决。 性能分析工具:`JConsole`, `VisualVM`, `Thread Dump`。 性能调优策略:合理选择线程池大小,避免不必要的同步,使用更高效的并发工具。 死锁定位技巧:通过线程转储(Thread Dump)分析。 死锁发生时的处理策略。 第十一章:Java 1.8+ 并发新特性与实践 Lambda 表达式与 Stream API 在并发编程中的应用。 CompletableFuture:声明式异步编程,链式调用,组合式 Future。 CompletableFuture 的常用方法:`supplyAsync`, `thenApply`, `thenAccept`, `thenCompose`, `thenCombine`。 CompletableFuture 的异常处理。 `parallelStream()` 的原理与使用。 Java 内存模型在 JRE 1.8 之后的演进(如果存在)。 JVM 垃圾回收器对并发性能的影响。 结语: 掌握并发编程,是迈向高级 Java 开发者的必经之路。《深入理解 Java 异步与并发模型》将是你在这条道路上的得力助手。本书不仅提供了详实的理论讲解,更注重结合实际场景,通过丰富的代码示例,帮助读者将所学知识融会贯通,真正做到学以致用。阅读本书,你将能更自信地设计和实现高效、稳定、可伸缩的并发应用程序,从而在技术浪潮中脱颖而出。
作为一名 Java 开发者,我一直对 JVM 的底层原理和性能优化非常感兴趣。这本书在这方面的内容可以说做得非常出色。它并没有止步于表面上的线程 API,而是深入挖掘了 Java 内存模型(JMM)这个核心概念。通过对 JMM 的细致讲解,我终于理解了为什么会出现可见性、原子性和有序性问题,以及 Java 又是如何通过 happens-before 原则来保证这些的。书里对于 `volatile` 关键字的剖析更是让我印象深刻,不再仅仅是把它当成一个“神奇的”关键字,而是真正理解了它在内存屏障和缓存一致性方面的作用。此外,书中还花费了大量的篇幅来讲解线程池的原理和使用,特别是 `ThreadPoolExecutor` 这个类,它的各种参数和配置选项,以及如何根据实际需求来调优线程池的大小和策略,都讲得非常详细。我过去只是简单地使用 `Executors.newFixedThreadPool()`,现在才知道原来还有这么多讲究。通过学习书中的内容,我不仅能写出更健壮的多线程代码,还能更好地诊断和解决由并发引起的一些性能瓶颈问题。这本书对于想要提升 JVM 底层功底和并发性能优化的开发者来说,绝对是不可多得的宝藏。