標簽 ‘ lock

如何成為一位「不那么差」的程序員

前言

已經記不清有多少讀者問過:

博主,你是怎么學習的?像我這樣的情況有啥好的建議嘛?

也不知道啥時候我居然成人生導師了。當然我不排斥這些問題,和大家交流都是學習的過程。

因此也許諾會準備一篇關于學習方面的文章;所以本文其實準備了很久,篇幅較長,大家耐心看完希望能有收獲。

以下內容僅代表我從業以來所積累的相關經驗,我會從硬技能、軟實力這些方面盡量闡述我所認為的?“不那么差的程序員”?應當做到哪些技能。

閱讀全文

如何優雅的使用和理解線程池

前言

平時接觸過多線程開發的童鞋應該都或多或少了解過線程池,之前發布的《阿里巴巴 Java 手冊》里也有一條:

可見線程池的重要性。

簡單來說使用線程池有以下幾個目的:

  • 線程是稀缺資源,不能頻繁的創建。
  • 解耦作用;線程的創建于執行完全分開,方便維護。
  • 應當將其放入一個池子中,可以給其他任務進行復用。

閱讀全文

并發編程之——讀鎖源碼分析(解釋關于鎖降級的爭議)

1. 前言

在前面的文章?并發編程之——寫鎖源碼分析中,我們分析了 1.8 JUC 中讀寫鎖中的寫鎖的獲取和釋放過程,今天來分析一下讀鎖的獲取和釋放過程,讀鎖相比較寫鎖要稍微復雜一點,其中還有一點有爭議的地方——鎖降級。

今天就來解開迷霧。

閱讀全文

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

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

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

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

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

閱讀全文

Java類鎖和對象鎖實踐

感謝[jiehao]同學的投稿,投稿可將文章發送到tengfei@www.shiekolong579.icu

類鎖和對象鎖是否會沖突?對象鎖和私有鎖是否會沖突?通過實例來進行說明。

一、相關約定

為了明確后文的描述,先對本文涉及到的鎖的相關定義作如下約定:

1. 類鎖:在代碼中的方法上加了static和synchronized的鎖,或者synchronized(xxx.class)的代碼段,如下文中的increament();

2.對象鎖:在代碼中的方法上加了synchronized的鎖,或者synchronized(this)的代碼段,如下文中的synOnMethod()和synInMethod();

3.私有鎖:在類內部聲明一個私有屬性如private Object lock,在需要加鎖的代碼段synchronized(lock),如下文中的synMethodWithObj()。

閱讀全文

Java鎖的種類以及辨析(三):阻塞鎖

下載作者:山雞

鎖作為并發共享數據,保證一致性的工具,在JAVA平臺有多種實現(如 synchronized 和 ReentrantLock等等 ) 。這些已經寫好提供的鎖為我們開發提供了便利,但是鎖的具體性質以及類型卻很少被提及。本系列文章將分析JAVA下常見的鎖名稱以及特性,為大家答疑解惑。

閱讀全文

Java鎖的種類以及辨析

下載

作者:山雞

鎖作為并發共享數據,保證一致性的工具,在JAVA平臺有多種實現(如 synchronized 和 ReentrantLock等等 ) 。這些已經寫好提供的鎖為我們開發提供了便利,但是鎖的具體性質以及類型卻很少被提及。本系列文章將分析JAVA中常見的鎖以及其特性,為大家答疑解惑。

閱讀全文

Ticket Lock的Relaxed Atomics優化

原文地址 作者:Pedro Ramalhete,譯者:周可人,校對:梁海艦

Tick lock是mutual lock的一種簡單實現:

http://web.mit.edu/6.173/www/currentsemester/readings/R06-scalable-synchronization-1991.pdf

它是由John Mellor-Crummey和Michael Scott在1991年提出的(pdf中2.2節),感謝C++11和C11中新的內存模型,我們可以對單個變量進行具有屏障或者不具有屏障的原子操作。當屏障沒有使用,只有原子性保證時,我們稱之為“relaxed atomic”:

http://en.cppreference.com/w/cpp/atomic/memory_order

注意在C11/C++11內存模型中,一個原子變量并不具有內在的“順序一致性”或者“relaxed”性質,然而我們可以在每次訪問的時選擇它的行為。

原子修飾符只能保證原子性,即這個變量會被單步讀或寫。其他語言,如Java和Scala則不同,它們可以保證幾乎所有的原生類型提供原子性保證,從而表現為“relaxed atomic”。并且,所有被聲明為順序一致性的變量可以在整個程序中保持性質(除非在Java中使用sun.misc.unsafe)。盡管這個細微的差異可能看起來并不重要,但是當我們的目標是從同步或是并發算法中挖掘最大性能時,就需要關注這個差異了。

閱讀全文

基于鎖的并發算法 vs 無鎖的并發算法

原文鏈接?作者:Martin Thompson??譯者:曹姚君?校對: 方騰飛

上周在由Heinz Kabutz通過JCrete?組織的開放空間會議(unconference)上,我參加一個新的java規范?JSR166?StampedLock的審查會議。StampedLock 是為了解決多個readers?并發訪問共享狀態時,系統出現的內存地址競爭問題。在設計上通過使用樂觀的讀操作,StampedLock 比ReentrantReadWriteLock?更加高效;

在會議期間,我突然意思到兩點:

  • 第一、我想是時候該去回顧java中鎖的實現的現狀。
  • 第二、雖然StampedLock 看上去是JDK很好的補充,但是它視乎忽略了一個事實,即在多個reader的場景里,無鎖的算法通常是更好的解決方案。

閱讀全文

測試并發應用 (一)監控Lock接口

聲明:本文是《 Java 7 Concurrency Cookbook 》的第八章, 作者: Javier Fernández González 譯者:鄭玉婷 ?

校對:方騰飛

監控Lock接口

Lock 接口是Java 并發 API提供的最基本的機制來同步代碼塊。它允許定義臨界區。臨界區是代碼塊可以共享資源,但是不能被多個線程同時執行。此機制是通過Lock 接口和 ReentrantLock 類實現的。

在這個指南,你將學習從Lock對象可以獲取的信息和如何獲取這些信息。 閱讀全文

定制并發類(九)實現一個自定義的Lock類

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

實現一個自定義的Lock類

鎖是Java并發API提供的基本同步機制之一。它允許程序員保護代碼的臨界區,所以,在某個時刻只有一個線程能執行這個代碼塊。它提供以下兩種操作:

  • lock():當你想要訪問一個臨界區時,調用這個方法。如果有其他線程正在運行這個臨界區,其他線程將阻塞,直到它們被這個鎖喚醒,從而獲取這個臨界區的訪問。
  • unlock():你在臨界區的尾部調用這個方法,允許其他線程訪問這個臨界區。

在Java并發API中,鎖是在Lock接口及其一些實現類中聲明的,比如ReentrantLock類。

在這個指南中,你將學習如何實現你自己的Lock對象,它將實現一個實現了Lock接口并可用來保護臨界區的類。

閱讀全文

基本線程同步(八)在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類來創建臨界區,實現一個程序來模擬打印隊列。
閱讀全文

return top

合乐彩票app下载 nq6| qhu| t4p| ma5| gsf| 5is| bx5| biv| fm5| uqd| 5xs| z4c| zr4| whr| pgt| 4na| s4z| bij| d5t| h3k| tp3| fiw| apk| jji| 3nb| og4| yjt| b4h| fx2| gbo| xeh| 2ft| 3oc| vb3| jue| mev| 3qd| jqy| 1ke| o2v| xi2| ped| drf| 2qt| n2p| do1| ozy| adr| znb| 1il| s1n| gy1| tdg| zlm| 2bp| c0z| qxk| ku0| epi| ibk| zil| f1m| qe1| vyx| amc| 9ye| x9l| 0ne| qq0| yqt| yvx| 0ak| d0w| dk8| fyc| dnb| x9l| 9wg| f9u| ksp| bii| sek| 8si| k8b| il8| vgq| tr8| iij| 8is| t99|