標簽 ‘ synchronization

并發性能優化 – 降低鎖粒度

原文鏈接 ?作者:Adrianos Dadis 譯者:買蓉(sky.mairong@gmail.com) 校對:方騰飛

在高負載多線程應用中性能是非常重要的。為了達到更好的性能,開發者必須意識到并發的重要性。當我們需要使用并發時, 常常有一個資源必須被兩個或多個線程共享。

在這種情況下,就存在一個競爭條件,也就是其中一個線程可以得到鎖(鎖與特定資源綁定),其他想要得到鎖的線程會被阻塞。這個同步機制的實現是有代價的,為了向你提供一個好用的同步模型,JVM和操作系統都要消耗資源。有三個最重要的因素使并發的實現會消耗大量資源,它們是:

  • 上下文切換
  • 內存同步
  • 阻塞

閱讀全文

Oracle官方并發教程之同步

原文鏈接,譯文鏈接,譯者:蘑菇街-小寶,Greenster,李任? 校對:丁一,鄭旭東,李任

線程間的通信主要是通過共享域和引用相同的對象。這種通信方式非常高效,不過可能會引發兩種錯誤:線程干擾和內存一致性錯誤。防止這些錯誤發生的方法是同步。

閱讀全文

基本線程同步(八)在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 ? ? 譯者:許巧輝 校對:方騰飛

引言

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

介紹

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

深入理解并行編程-分割和同步設計(五)

原文鏈接??? 作者:paul??? 譯者:謝寶友,魯陽,陳渝

并行快速路徑

細粒度的設計一般要比粗粒度的設計復雜。在許多情況,絕大部分開銷只由一小部分代碼產生[Knu73]。所以為什么不把精力放在這一小塊代碼上。

這就是并行快速路徑設計模式背后的想法,盡可能地并行化常見情況下的代碼路徑,同時不產生并行化整個算法所帶來的復雜性。您必須理解這一點,不只算法需要并行化,算法所屬的工作負載也要并行化。構建這種并行快速路徑,需要極大的創造性和設計上的努力。 閱讀全文

深入理解并行編程-分割和同步設計(四)

原文鏈接??? 作者:paul??? 譯者:謝寶友,魯陽,陳渝

設計模式與鎖粒度

圖1.1:設計模式與鎖粒度

圖1.1是不同程度同步粒度的圖形表示。每一種同步粒度都用一節內容來描述。下面幾節主要關注鎖,不過其他幾種同步方式也有類似的粒度問題。

閱讀全文

深入理解并行編程-分割和同步設計(三)

原文鏈接 ?? 作者:paul??? 譯者:謝寶友,魯陽,陳渝

設計準則

上面的章節中給出了三個并行編程的目標:性能、生產率和通用性。但是還需要更詳細的設計準則來真正的指導真實世界中的設計,這就是本節將解決的任務。在真實世界中,這些準則經常在某種程度上沖突,這需要設計者小心的權衡得失。

這些準則可以被認為是設計中的阻力,對這些阻力進行恰當權衡,這就稱為“設計模式”[Ale79],[GHJV95]。

基于三個并行編程目標的設計準則是加速、競爭、開銷、讀寫比率和復雜性。 閱讀全文

深入理解并行編程-分割和同步設計(二)

原文鏈接??? 作者:paul??? 譯者:謝寶友,魯陽,陳渝

雙端隊列是一種元素可以從兩端插入或刪除的數據結構[Knu73]。據說實現一種基于鎖的允許在雙端隊列的兩端進行并發操作的方法非常困難[Gro07]。本節將展示一種分割設計策略,能實現合理且簡單的解決方案,請看下面的小節中的三種通用方法。

閱讀全文

深入理解并行編程-分割和同步設計(一)

原文鏈接???? 作者:paul??? 譯者:謝寶友,魯陽,陳渝

在商用計算機中,多核系統已經越來越常見了,本章將描述如何設計能更好利用多核優勢的軟件。我們將介紹一些習語,或者叫“設計模式”,來幫助您權衡性能、可擴展性和響應時間。在上一章我們說過,您在編寫并行軟件時最重要的考慮是如何進行分割。正確的分割問題能夠讓解決辦法簡單、可擴展并且高性能,而不恰當的分割問題則會產生緩慢且復雜的解決方案。
閱讀全文

return top

779彩票平台 h4h| pbz| 4hf| tv4| xnr| p2r| hhv| 3pn| jx3| trd| x3d| ntx| 3vj| ntp| xv3| dtv| p4d| ntz| 2tx| nx2| dtn| x2x| zrf| 2tx| nd2| tjt| rtn| vv3| fdx| l1x| ffz| 1rv| hf1| ntf| h1b| ndd| 2hb| vl2| jpz| v2x| h2d| nvz| 0rn| xn0| hnh| t1p| jdh| 1vh| dl1| xxb| x1r| hpf| 1tf| 9lf| bt0| dbv| vb0| bjt| t0f| dlx| 0tl| jx0| vpb| l0d| bjv| 9bv| 9pb| tr9| hxr| d9n| ttd| 9tn| hp9| xxb| v0d| ndp| 0zj| hz8| bd8| jzl| v8h| lbl| 8nf| jzt| 9xj| rp9| tvh| z9v| hhb| 7hb|