具體描述
作 者:高洪岩 著 定 價: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 多綫程領域近乎完美的梳理和呈現。它不是簡單地羅列API,而是以一種高度體係化的方式,將看似零散的知識點串聯起來。讓我印象深刻的是,它並沒有迴避 Java 並發編程中那些“灰色地帶”,比如指令重排、內存可見性延遲等底層原理,而是通過深入淺齣的講解,讓這些抽象的概念變得觸手可及。書中的圖示和類比非常到位,幫助我理解瞭那些容易混淆的概念,比如 `Lock` 和 `synchronized` 的區彆與聯係,以及 `AbstractQueuedSynchronizer` (AQS) 這樣一個強大的並發框架的底層機製。我尤其欣賞它對並發場景的深入剖析,從常見的綫程池配置到復雜的分布式鎖實現,都進行瞭細緻的講解和代碼示例。讀這本書,不僅僅是學習瞭一門技術,更像是進行瞭一次思維的升華,讓我能夠從更高的維度去審視和設計並發係統。它讓我明白瞭,寫齣高效、健壯的多綫程程序,需要的不僅僅是代碼技巧,更重要的是對底層原理的深刻理解和對並發風險的敏銳洞察。這本書絕對是我在 Java 並發編程學習道路上的一座裏程碑。