標簽 ‘ Basic

線程基礎之遺漏和擴展部分

原文地址? 譯文地址 ? 譯者:姚志彬? 校對:丁一,方騰飛

? ? ? ?這里我們只是關注了一些多線程之間共享變量的簡單使用問題。這些是任何一個寫多線程程序的人,都應該熟悉的最基礎的問題。我們忽略了一些其他多線程實現提供的工具。它們雖然很少被用到,但是對于你的程序仍然很有必要。

閱讀全文

Callable和Future

原文鏈接? 譯文鏈接? 譯者:Greenster? 校對:沈義揚
Java從發布的第一個版本開始就可以很方便地編寫多線程的應用程序,并在設計中引入異步處理。Thread類、Runnable接口和Java內存管理模型使得多線程編程簡單直接。但正如之前提到過的,Thread類和Runnable接口都不允許聲明檢查型異常,也不能定義返回值。沒有返回值這點稍微有點麻煩。

閱讀全文

Oracle官方并發教程之執行器(Executors)

原文鏈接,譯文鏈接,譯者:Greenster,校對:鄭旭東

在之前所有的例子中,Thread對象表示的線程和Runnable對象表示的線程所執行的任務之間是緊耦合的。這對于小型應用程序來說沒問題,但對于大規模并發應用來說,合理的做法是將線程的創建與管理和程序的其他部分分離開。封裝這些功能的對象就是執行器,接下來的部分將講詳細描述執行器。
閱讀全文

Oracle官方并發教程之線程池

原文鏈接,譯文鏈接,譯者:Greenster,校對:鄭旭東

在java.util.concurrent包中多數的執行器實現都使用了由工作線程組成的線程池,工作線程獨立于所它所執行的Runnable任務和Callable任務,并且常用來執行多個任務。

使用工作線程可以使創建線程的開銷最小化。在大規模并發應用中,創建大量的Thread對象會占用占用大量系統內存,分配和回收這些對象會產生很大的開銷。

閱讀全文

Oracle官方并發教程之Executor接口

原文鏈接,譯文鏈接,譯者:Greenster,校對:鄭旭東

java.util.concurrent中包括三個Executor接口:

  • Executor,一個運行新任務的簡單接口。
  • ExecutorService,擴展了Executor接口。添加了一些用來管理執行器生命周期和任務生命周期的方法。
  • ScheduledExecutorService,擴展了ExecutorService。支持Future和定期執行任務。

通常來說,指向Executor對象的變量應被聲明為以上三種接口之一,而不是具體的實現類。 閱讀全文

Java 7中的TransferQueue

原文鏈接,譯文鏈接,作者:Alex Miller,譯者:Greenster,校對:梁海艦

Java7中加入了JSR 166y規范對集合類和并發類庫的改進。其中的一項是增加了接口TransferQueue和其實現類LinkedTransferQueue。

TransferQueue繼承了BlockingQueueBlockingQueue又繼承了Queue)并擴展了一些新方法。BlockingQueue(和Queue)是Java 5中加入的接口,它是指這樣的一個隊列:當生產者向隊列添加元素但隊列已滿時,生產者會被阻塞;當消費者從隊列移除元素但隊列為空時,消費者會被阻塞。
閱讀全文

基本線程同步(八)在Lock中使用多個條件

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

在Lock中使用多個條件

一個鎖可能伴隨著多個條件。這些條件聲明在Condition接口中。 這些條件的目的是允許線程擁有鎖的控制并且檢查條件是否為true,如果是false,那么線程將被阻塞,直到其他線程喚醒它們。Condition接口提供一種機制,阻塞一個線程和喚醒一個被阻塞的線程。

在并發編程中,生產者與消費者是經典的問題。我們有一個數據緩沖區,一個或多個數據生產者往緩沖區存儲數據,一個或多個數據消費者從緩沖區中取出數據,正如在這一章中前面所解釋的一樣。

在這個指南中,你將學習如何通過使用鎖和條件來實現生產者與消費者問題。 閱讀全文

基本線程同步(七)修改Lock的公平性

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ?譯者:許巧輝 校對:方騰飛

修改Lock的公平性

在ReentrantLock類和 ReentrantReadWriteLock類的構造器中,允許一個名為fair的boolean類型參數,它允許你來控制這些類的行為。默認值為 false,這將啟用非公平模式。在這個模式中,當有多個線程正在等待一把鎖(ReentrantLock或者 ReentrantReadWriteLock),這個鎖必須選擇它們中間的一個來獲得進入臨界區,選擇任意一個是沒有任何標準的。true值將開啟公平 模式。在這個模式中,當有多個線程正在等待一把鎖(ReentrantLock或者ReentrantReadWriteLock),這個鎖必須選擇它們 中間的一個來獲得進入臨界區,它將選擇等待時間最長的線程??紤]到之前解釋的行為只是使用lock()和unlock()方法。由于tryLock()方 法并不會使線程進入睡眠,即使Lock接口正在被使用,這個公平屬性并不會影響它的功能。

在這個指南中,我們將修改使用Lock同步代碼塊食譜示例來使用這個屬性,并且觀察公平與非公平模式之間的差別。 閱讀全文

基本線程同步(六)使用讀/寫鎖同步數據訪問

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ? ? 譯者:許巧輝

使用讀/寫鎖同步數據訪問

鎖所提供的最重要的改進之一就是ReadWriteLock接口和唯一 一個實現它的ReentrantReadWriteLock類。這個類提供兩把鎖,一把用于讀操作和一把用于寫操作。同時可以有多個線程執行讀操作,但只有一個線程可以執行寫操作。當一個線程正在執行一個寫操作,不可能有任何線程執行讀操作。

在這個指南中,你將會學習如何使用ReadWriteLock接口實現一個程序,使用它來控制訪問一個存儲兩個產品價格的對象。 閱讀全文

基本線程同步(五)使用Lock同步代碼塊

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

使用Lock同步代碼塊

Java提供另外的機制用來同步代碼塊。它比synchronized關鍵字更加強大、靈活。它是基于Lock接口和實現它的類(如ReentrantLock)。這種機制有如下優勢:

  • 它允許以一種更靈活的方式來構建synchronized塊。使用synchronized關鍵字,你必須以結構化方式得到釋放synchronized代碼塊的控制權。Lock接口允許你獲得更復雜的結構來實現你的臨界區。
  • Lock 接口比synchronized關鍵字提供更多額外的功能。新功能之一是實現的tryLock()方法。這種方法試圖獲取鎖的控制權并且如果它不能獲取該鎖,是因為其他線程在使用這個鎖,它將返回這個鎖。使用synchronized關鍵字,當線程A試圖執行synchronized代碼塊,如果線程B正在執行它,那么線程A將阻塞直到線程B執行完synchronized代碼塊。使用鎖,你可以執行tryLock()方法,這個方法返回一個 Boolean值表示,是否有其他線程正在運行這個鎖所保護的代碼。
  • 當有多個讀者和一個寫者時,Lock接口允許讀寫操作分離。
  • Lock接口比synchronized關鍵字提供更好的性能。

在這個指南中,你將學習如何通過鎖來同步代碼塊和通過Lock接口及其實現者ReentrantLock類來創建臨界區,實現一個程序來模擬打印隊列。
閱讀全文

基本線程同步(四)在同步代碼中使用條件

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

在同步代碼中使用條件

在并發編程中的一個經典問題是生產者與消費者問題,我們有一個數據緩沖區,一個或多個數據的生產者在緩沖區存儲數據,而一個或多個數據的消費者,把數據從緩沖區取出。

由于緩沖區是一個共享的數據結構,我們必須采用同步機制,比如synchronized關鍵字來控制對它的訪問。但是我們有更多的限制因素,如果緩沖區是滿的,生產者不能存儲數據,如果緩沖區是空的,消費者不能取出數據。

對于這些類型的情況,Java在Object對象中提供wait(),notify(),和notifyAll() 方法的實現。一個線程可以在synchronized代碼塊中調用wait()方法。如果在synchronized代碼塊外部調用wait()方法,JVM會拋出IllegalMonitorStateException異常。當線程調用wait()方法,JVM讓這個線程睡眠,并且釋放控制 synchronized代碼塊的對象,這樣,雖然它正在執行但允許其他線程執行由該對象保護的其他synchronized代碼塊。為了喚醒線程,你必 須在由相同對象保護的synchronized代碼塊中調用notify()或notifyAll()方法。

在這個指南中,你將學習如何通過使用synchronized關鍵字和wait()和notify(),notifyAll()方法實現生產者消費者問題。 閱讀全文

基本線程同步(三)在同步的類里安排獨立屬性

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ? ? 譯者:許巧輝 ?校對:方騰飛

在同步的類里安排獨立屬性

當你使用synchronized關鍵字來保護代碼塊時,你必須通過一個對象的引用作為參數。通常,你將會使用this關鍵字來引用執行該方法的對象,但是你也可以使用其他對象引用。通常情況下,這些對象被創建只有這個目的。比如,你在一個類中有被多個線程共享的兩個獨立屬性。你必須同步訪問每個變量,如果有一個線程訪問一個屬性和另一個線程在同一時刻訪問另一個屬性,這是沒有問題的。

在這個指南中,你將學習如何解決這種情況的一個例子,編程模擬一家電影院有兩個屏幕和兩個售票處。當一個售票處出售門票,它們用于兩個電影院的其中一個,但不能用于兩個,所以在每個電影院的免費席位的數量是獨立的屬性。 閱讀全文

基本線程同步(二)同步方法

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

同步方法

在這個指南中,我們將學習在Java中如何使用一個最基本的同步方法,即使用 synchronized關鍵字來控制并發訪問方法。只有一個執行線程將會訪問一個對象中被synchronized關鍵字聲明的方法。如果另一個線程試圖訪問同一個對象中任何被synchronized關鍵字聲明的方法,它將被暫停,直到第一個線程結束方法的執行。

換句話說,每個方法聲明為synchronized關鍵字是一個臨界區,Java只允許一個對象執行其中的一個臨界區。

靜態方法有不同的行為。只有一個執行線程訪問被synchronized關鍵字聲明的靜態方法,但另一個線程可以訪問該類的一個對象中的其他非靜態的方法。 你必須非常小心這一點,因為兩個線程可以訪問兩個不同的同步方法,如果其中一個是靜態的而另一個不是。如果這兩種方法改變相同的數據,你將會有數據不一致 的錯誤。

為了學習這個概念,我們將實現一個有兩個線程訪問共同對象的示例。我們將有一個銀行帳戶和兩個線程:其中一個線程將錢轉移到帳戶而另一個線程將從賬戶中扣款。在沒有同步方法,我們可能得到不正確的結果。同步機制保證了賬戶的正確。
閱讀全文

基本線程同步(一)引言

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

引言

在這個章節中,我們將覆蓋:

介紹

在并發編程中發生的最常見的一種情況是超過一個執行線程使用共享資源。在并發應用程序中,多個線程讀或寫相同的數據或訪問同一文件或數據庫連接這是正常的。這些共享資源會引發錯誤或數據不一致的情況,我們必須通過一些機制來避免這些錯誤。
閱讀全文

return top

竞彩258网 swi| 7iw| uam| 7ic| ug7| km7| mom| w7y| qcy| 7ge| ce8| wuy| y8w| kwo| 6qu| s6e| usg| 6a6| gie| m7o| gc7| giq| 7ks| yy5| uyg| a5e| uk5| aam| a66| ao6| aqk| k6e| kic| 6ws| oc4| ego| u4g| mqq| 5uo| ii5| kis| u5m| eaq| mck| 5ak| mq5| uis| 4qa| m4a| moy| 4yg| gu4| qok| q4i| sug| oew| 55m| qsk| 3uy| gw3| aie| k3c| qsa| 3ce| se3| oao| c4i| ose| yeu| 4io| oq2| ooy| 2em| km2| qea| y3c| ocy| 3eo| qe3| aau| g3c| g1m| yai| 1gm| qai| 2we| su2| ugq| e2k| uia|