java多線程變成


Java 線程基礎
Java 多線程開發
線程安全與同步
併發控制
非阻塞套接字(NIO)
Java 5 中的併發
JDK 7 中的 Fork/Join 模式
相關書評



Java 平臺提供了一套廣泛而功能強大的 API、工具和技術。其中,內建支持線程是它的一個強大的功能。這一功能爲使用 Java 編程語言的程序員提供了併發編程這一誘人但同時也非常具有挑戰性的選擇。本專題彙集了與 Java 多線程與併發編程相關的文章和教程,幫助讀者理解 Java 併發編程的模式及其利弊,向讀者展示瞭如何更精確地使用 Java 平臺的線程模型。


Java 線程基礎

Java 線程簡介
本教程研究了線程的基礎知識 — 線程是什麼、線程爲什麼有用以及怎麼開始編寫使用線程的簡單程序。 我們還將研究更復雜的、使用線程的應用程序的基本構件 — 如何在線程之間交換數據、如何控制線程以及線程如何互相通信。

Java 程序中的多線程
由於在語言級提供了線程支持,在 Java 語言中使用多線程要遠比在 C 或 C++ 中來得簡單。本文通過簡單的程序示例展現了在 Java 程序中線程編程的簡單性。在學習完本文後,用戶應該能夠編寫簡單的多線程程序。

編寫多線程的 Java 應用程序
Java Thread API 允許程序員編寫具有多處理機制優點的應用程序,在後臺處理任務的同時保持用戶所需的交互感。本文介紹了 Java Thread API,並概述多線程可能引起的問題以及常見問題的解決方案。

如果我是國王:關於解決 Java 編程語言線程問題的建議
Allen Holub 指出,Java 編程語言的線程模型可能是此語言中最薄弱的部分。它完全不適合實際複雜程序的要求,而且也完全不是面向對象的。本文建議對 Java 語言進行重大修改和補充,以解決這些問題。


回頁首



Java 多線程開發

構建 Java 併發模型框架
線程間同步、數據一致性等煩瑣的問題需要細心的考慮,一不小心就會出現一些微妙的,難以調試的錯誤。另外,應用邏輯和線程邏輯糾纏在一起,會導致程序的邏 輯結構混亂,難以複用和維護。本文試圖給出一個解決這個問題的方案,通過構建一個併發模型框架,使得開發多線程的應用變得容易。

使您輕鬆地進行多線程應用 程序編程
生產者/消費者方案是多線程應用程序開發中最常用的構造之一 — 因此困難也在於此。因爲在一個應用程序中可以多次重複生產者/消費者行爲,其代碼也可以如此。本文創建了 Consumer 類,該類通過在一些多線程應用程序中促進代碼重用以及簡化代碼調試和維護來解決這個問題 。

使用 Java 建立穩定的多線程服務器
本文詳細的介紹了使用 Java 語言建立一套多線程服務器的過程,該服務器使用對象傳遞消息,在線程中使用隊列機制,使服務器的性能大大提高了。這套服務器可以被用於各種 C/S 或 B/S 結構的應用程序中。

線程池的介紹及簡單 實現
服務器程序利用線程技術響應客戶請求已經司空見慣,可能您認爲這樣做效率已經很高,但您有沒有想過優化一下使用線程的方法。本文將向您介紹服務器程序如何 利用線程池來優化性能並提供一個簡單的線程池實現。

Java 實時多任務調度過程中的安全監控設計
在一系列關聯的多任務的實時環境中,如果有一個任務發生失敗,可能導致所有任務產生連鎖反應,從而造成調度失控的局面。特別是對於核心控制設備尤其重要, 爲了解決這個問題,必須對每個任務進行實時監控。


回頁首



線程安全與同步

不要重新分配 被鎖定對象的對象引用
當一個實例在同步代碼中被鎖定,對此對象和其引用的修改會是咋樣呢?對一個對象的同步操作只是鎖定了該對象。您需要注意不要重新分配被鎖定對象的引用。

以一個固定、 全局次序獲取多個鎖
當兩個或多個線程在互相等待時被阻塞就發生了死鎖。死鎖是在多線程代碼中最難解決的問題。要解決它,就必須以一個固定、全局次序獲取多個鎖。

Java 單例對象同步問題探討
本文將探討在多線程環境下,使用單例對象作配置信息管理時可能會帶來的幾個同步問題,並針對每個問題給出可選的解決辦法。

Java 理論與實踐: 描繪線程安全性
7月份我們的併發專家 Brian Goetz 將 Hashtable 和 Vector 類描述爲“有條件線程安全的”。一個類難道不是線程安全就是線程不安全的嗎?不幸的是,線程安全並不是一個非真即假的命題,它的定義出人意料的困難。但 是,正如Brian 在本月的 Java 理論與實踐中解釋的,儘量在 Javadoc 中對類的線程安全性進行歸類是非常重要的。

編寫高效的線程安全 (thread-safe)類
在語言級別支持對象的鎖定和線程內信號機制使得編寫線程安全的類變得簡單。在這裏,通過簡單的程序示例描述了在 Java 中強大和獨具一格的線程安全和高效類的開發。

輕鬆使用線程
與許多其它的編程語言不同,Java 語言規範包括對線程和併發的明確支持。語言本身支持併發,這使得指定和管理共享數據的約束以及跨線程操作的計時變得更簡單,但是這沒有使得併發編程的複雜 性更易於理解。這個三部分的系列文章的目的在於幫助程序員理解用 Java 語言進行多線程編程的一些主要問題,特別是線程安全對 Java 程序性能的影響。

  • 第 1 部分,同步不是敵人
    在本系列的第 1 部分,我們將討論什麼時候需要同步,而同步的代價到底有多大?

  • 第 2 部分,減少爭用
    嚴重的爭用將嚴重損害應用程序的可伸縮性 — 隨着負載的增加,存在嚴重爭用同步的應用程序的性能將顯著降低。本文將探討能夠減少爭用的幾種技術,以提高您程序的可伸縮性。

  • 第 3 部分,不共享有時是最好的
    ThreadLocal 類是悄悄地出現在 Java 平臺版本 1.2 中的。雖然 ThreadLocal 極少受到關注,但對簡化線程安全併發程序的開發來說,它卻是很方便的。本文研究了 ThreadLocal 並提供了一些使用技巧。

適用於 Java 程序員的 CSP
在這篇由三部分組成的系列文章中,介紹了一個理論,該理論承認了併發編程的複雜性,並且沒有試圖隱藏這種複雜性,或者使它不那麼難於學習和應用。通信順序 進程(Communicating Sequential Processes —— CSP) 是一個精確的併發數學理論,可以用來構建多線程應用程序,確保構建的程序中不出現併發的常見問題,而且更重要的是,這一點 能夠得到證實。

  • 第 1 部分,在 Java 平臺上進行多線程編程的缺陷
    本文先從 Java 平臺的併發編程技術概述開始,接着提供了多線程應用程序開發缺陷的深入概述,這些缺陷包括:競爭冒險、死鎖、活動鎖和資源耗盡等。

  • 第 2 部分,用 JCSP 進行併發編程
    本文將介紹如何使用基於 Java 的 JCSP 庫來編寫能夠確保沒有併發問題(例如爭用風險、 死鎖、活動鎖、資源耗盡)的 Java 應用程序。

  • 第 3 部分,JCSP 的高級主題
    本文通過介紹 JCSP 開發高級主題,結束了由三部分組成的介紹適用於 Java 開發人員的 CSP 的系列文章,介紹的內容包括:JCSP 與 AOP 的相似性、JCSP 與 java.util.concurrent 的比較,以及用 JCSP 進行高級同步。

實現一 個不受約束的不變性模型
不變對象對於編寫線程安全的軟件來說非常有幫助。在 Java 語言中,保證不變性的主要機制是使用 final 字段。但 final 字段必須在構造函數中設置,而在一些情況中,這一要求未免太過侷限。本文將介紹一種有效的實現方式,使用標準緩存字段來實現一個略微隨意的不變性模型,該 字段的值無需同步也能安全訪問。

實時 Java: 線程化和同步
本文是關於實時 Java 系列文章(共 5 部分)的第三篇,考察了 Java 實時規範(RTSJ)的實現必須支持的線程化和同步問題。您還將瞭解開發和部署實時應用程序時必須牢記的一些有關這兩方面的基本考慮。

IBM 的 Java 診斷: 使用面向 Java 的 Lock Analyzer 診斷同步和鎖問題
鎖爭用會降低應用程序性能,該工具會突出顯示發生鎖爭用的線程。 開發人員可以使用該信息修改其應用程序以減少鎖爭用,從而提高性能。本文介紹了面向 Java 的 IBM 鎖分析器,介紹了其構建的基礎架構並針對該工具的未來發展方向進行了思考。


回頁首



併發控制

實 現 Java 多線程併發控制框架
Java 多線程是提高程序效能的利器,本文並不是告訴您如何編寫多線程 Java 程序,而着重於多線程的併發控制以及如何描述線程執行的過程。當您需要完全掌控 Java 多線程執行的過程時,本文將會對您有所幫助。

多線程、多平臺環境中的跟 蹤
大多數 Java 程序員都使用某種跟蹤系統來跟蹤開發中的代碼的潛在錯誤和問題。然而,多線程和多平臺環境可能產生大量莫名其妙的跟蹤數據。本文提供了一些技巧,幫助您理 解複雜應用程序中產生的跟蹤數據。

使用 ConTest 進行多線程單元測試
衆所周知並行程序設計易於產生 bug。更爲嚴重的是,往往在開發過程的晚期當這些並行 bug 引起嚴重的損害時才能發現它們並且難於調試它們。即使徹底地對它們進行了調試,常規的單元測試實踐也很可能遺漏並行 bug。本文解釋了爲什麼並行 bug 如此難於捕獲並且介紹了 IBM Research 的一種新的解決方案。


回頁首



非阻塞套接字(NIO)

NIO 入門
在本教程中,我們將討論 NIO 庫的幾乎所有方面,從高級的概念性內容到底層的編程細節。除了學習諸如緩衝區和通道這樣的關鍵 I/O 元素外,您還有機會看到在更新後的庫中標準 I/O 是如何工作的。您還會了解只能通過 NIO 來完成的工作,如異步 I/O 和直接緩衝區。

實現非阻塞套接字的一種簡單方 法
儘管 SSL 阻塞操作 — 當讀寫數據的時候套接字的訪問被阻塞 — 與對應的非阻塞方式相比提供了更好的 I/O 錯誤通知,但是非阻塞操作允許調用的線程繼續運行。本文中,作者同時就客戶端和服務器端描述瞭如何使用 Java Secure Socket Extensions (JSSE) 和 Java NIO (新 I/O)庫創建非阻塞的安全連接,並且介紹了創建非阻塞套接字的傳統方法,以及使用 JSSE 和 NIO 的一種可選的(必需的)方法。

基於事件的 NIO 多線程服務器
JDK 1.4 提供的非阻塞 I/O(NIO)有效解決了多線程服務器存在的線程開銷問題,但在使用上略顯得複雜一些。許多基於 NIO 的多線程服務器程序往往直接基於選擇器(Selector)的 Reactor 模式實現。這種簡單的事件機制對於較複雜的服務器應用,顯然缺乏擴展性和可維護性, 而且缺乏直觀清晰的結構層次。本文將通過一個基於事件回調的 NIO 多線程服務器的設計,試圖提供一個簡潔、直觀、易於擴展的 NIO 多線程服務器模型。


回頁首



Java 5 中的併發

馴服 Tiger: 併發集合
Doug Lea 最初編寫的 util.concurrent 包變成了 JSR-166 ,然後又變成了 J2SE 平臺的 Tiger 版本。這個新庫提供的是併發程序中通常需要的一組實用程序。如果對於優化對集合的多線程訪問有興趣,那麼您就找對地方了。

JDK 5.0 中的併發
本教程將介紹 JDK 5.0 提供的用於併發的新實用程序類,並通過與現有併發原語(synchronized、wait() 和 notify())相比較,說明這些類如何提高了可伸縮性。

Java5 多線程實踐
Java 5 增加了新的類庫併發集 java.util.concurrent,該類庫爲併發程序提供了豐富的 API,使多線程編程在 Java 5 中更加容易,靈活。本文通過一個網絡服務器模型,來實踐 Java 5 的多線程編程,該模型中使用了 Java 5 中的線程池、阻塞隊列、可重入鎖等,還實踐了 Callable、 Future 等接口,並使用了 Java 5 的另外一個新特性泛型。

Java 理論與實踐
下列文章來自併發行專家 Brian Goetz 的“Java 理論與實踐”系列專欄,討論了 JDK 5 中併發編程。

  • 併發集合類
    DougLea 的 util.concurrent 包除了包含許多其他有用的併發構造塊之外,還包含了一些主要集合類型 List 和 Map 的高性能的、線程安全的實現。本文向您展示了用 ConcurrentHashMap 替換 Hashtable 或 synchronizedMap ,將有多少併發程序獲益。

  • 構建一個更好的 HashMap
    ConcurrentHashMap 是 Doug Lea 的 util.concurrent 包的一部分,它提供比 Hashtable 或者 synchronizedMap 更高程度的併發性。而且,對於大多數成功的 get() 操作它會設法避免完全鎖定,其結果就是使得併發應用程序有着非常好的吞吐量。本文仔細分析了 ConcurrentHashMap 的代碼,並探討 Doug Lea 是如何在不損失線程安全的情況下取得這麼驕人成績的。

  • JDK 5.0 中更靈活、更具可伸縮性的鎖定機制
    JDK 5.0 爲開發人員開發高性能的併發應用程序提供了一些很有效的新選擇。例如,java.util.concurrent.lock 中的類 ReentrantLock 被作爲 Java 語言中 synchronized 功能的替代,它具有相同的內存語義、相同的鎖定,但在爭用條件下卻有更好的性能,此外,它還有 synchronized 沒有提供的其他特性。這是否意味着我們應當忘記 synchronized,轉而只用 ReentrantLock 呢?併發性專家 Brian Goetz 剛從他的夏季休假中返回,他將爲我們提供答案。

  • 流行的原子
    在 JDK 5.0 之前,如果不使用本機代碼,就不能用 Java 語言編寫無等待、無鎖定的算法。在 java.util.concurrent 中添加原子變量類之後,這種情況發生了變化。請跟隨本文一起,瞭解這些新類如何使用 Java 語言開發高度可伸縮的無阻塞算法。您可以在本文的論壇中與作者或其他讀者共享您對本文的看法。

  • 非阻塞算法簡介
    Java 5.0 第一次讓使用 Java 語言開發非阻塞算法成爲可能,java.util.concurrent 包充分地利用了這個功能。非阻塞算法屬於併發算法,它們可以安全地派生它們的線程,不通過鎖定派生,而是通過低級的原子性的硬件原生形式 ―― 例如比較和交換。非阻塞算法的設計與實現極爲困難,但是它們能夠提供更好的吞吐率,對生存問題(例如死鎖和優先級反轉)也能提供更好的防禦。在這期的 Java 理論與實踐 中,併發性大師 Brian Goetz 演示了幾種比較簡單的非阻塞算法的工作方式。

  • 處理 InterruptedException
    Java 語言的很多方法,例如 Thread.sleep() 和 Object.wait(),都可以拋出 InterruptedException。這個異常是不能忽略的,因爲它是一個檢查異常(checked exception)。但是應該如何處理它呢?在本月的 “Java 理論與實踐” 中,併發專家 Brian Goetz 將解釋 InterruptedException 的含義,爲什麼拋出 InterruptedException,以及在捕捉到該異常時應該怎麼做。

  • 正確使用 Volatile 變量
    Java 語言包含兩種內在的同步機制:同步塊(或方法)和 volatile 變量。這兩種機制的提出都是爲了實現代碼線程的安全。其中 Volatile 變量的同步性較差(但有時它更簡單並且開銷更低),而且其使用也更容易出錯。在這期的 Java 理論與實踐中,Brian Goetz 將介紹幾種正確使用 volatile 變量的模式,並針對其適用性限制提出一些建議。

使用泛型 和併發改善集合
Java Collections Framework 是 Java 平臺的一個重要部分。桌面和企業應用程序通常都使用該框架來聚集集合項。本文將向您展示如何使用集合,同時利用 Java SE 6 中對該框架的增強。通過使用泛型和併發功能使您的應用程序具有更好的維護性和可伸縮性,您可以實現比 HashMap 或 TreeSet 更豐富的功能。


回頁首



JDK 7 中的 Fork/Join 模式

JDK 7 中的 Fork/Join 模式
隨着多核時代的來臨,軟件開發人員不得不開始關注並行編程領域。而 JDK 7 中將會加入的 Fork/Join 模式是處理並行編程的一個經典的方法。雖然不能解決所有的問題,但是在它的適用範圍之內,能夠輕鬆的利用多個 CPU 提供的計算資源來協作完成一個複雜的計算任務。通過利用 Fork/Join 模式,我們能夠更加順暢的過渡到多核的時代。本文將介紹使用 JDK 7 中 Fork/Join 模式的方法和其他相關改進。閱讀本文之後,讀者將能夠獨立地在軟件開發中使用 Fork/Join 模式來改進程序的性能。

Java 理論與實踐: 應用 fork-join 框架
Java 7 的 java.util.concurrent 包的新增功能之一是一個 fork-join 風格的並行分解框架。fork-join 概念提供了一種分解多個算法的自然機制,可以有效地應用硬件並行性。

Java 理論與實踐: 應用 fork-join 框架,第 2 部分
在第 1 部分中,Brian Goetz 演示了 fork-join 如何爲衆多的算法提供一種自然的分解機制,以有效地利用硬件的並行性。在本文中,他將介紹 ParallelArray 類,這個類簡化了內存中數據結構上的並行排序和搜索操作。


回頁首



相關書評

不僅僅是另一 本併發性圖書
如果以前沒有購買 Java Concurrency in Practice(Goetz 等,Addison-Wesley,2006 年),那麼現在該購買了。經驗豐富的 Java 開發人員(和流行書作者)Sing Li 介紹了爲什麼即使併發性還沒進入您的日常開發,也應當閱讀這本重要的圖書。該書由 developerWorks 的長期作者和併發性專家 Goetz 執筆。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章