1. 程式人生 > >java共享鎖實現原理及CountDownLatch解析

java共享鎖實現原理及CountDownLatch解析

前言

前面介紹了ReentrantLock,又叫排他鎖,本篇主要通過CountDownLatch的學習來了解java併發包中是如何實現共享鎖的。

CountDownLatch使用解說

CountDownLatch是java5中新增的一個併發工具類,其使用非常簡單,下面通過虛擬碼簡單看一下使用方式:

這裡寫圖片描述

這是一個使用CountDownLatch非常簡單的例子,建立的時候,需要指定一個初始狀態值,本例為2,主執行緒呼叫 latch.await時,除非latch狀態值為0,否則會一直阻塞休眠。當所有任務執行完後,主執行緒喚醒,最終執行列印動作。

以上只是一個最簡單的例子,接著咱們再來看一個,這回,咱們想要在任務執行完後做更多的事情,如下圖所示:

這裡寫圖片描述

這一次,線上程3和執行緒4中,分別呼叫了latch.await(),當latch狀態值為0時,這兩個執行緒將會繼續執行任務,但是順序性是無法保證的。

CountDownLatch的方便之處在於,你可以在一個執行緒中使用,也可以在多個執行緒上使用,一切只依據狀態值,這樣便不會受限於任何的場景。

java共享鎖模型

在java5提供的併發包下,有一個AbstractQueuedSynchronizer抽象類,也叫AQS,此類根據大部分併發共性作了一些抽象,便於開發者實現如排他鎖,共享鎖,條件等待等更高階的業務功能。它通過使用CAS和佇列模型,出色的完成了抽象任務,在此向Doug Lea致敬。

AQS比較抽象,並且是優化精簡的程式碼,如果一頭扎進去,可能會比較容易迷失。本篇只解說CountDownLatch中使用到的共享鎖模型。

我們以CountDownLatch第二個例子作為案例來分析一下,一開始,我們建立了一個CountDownLatch例項,

這裡寫圖片描述

此時,AQS中,狀態值state=2,對於 CountDownLatch 來說,state=2表示所有呼叫await方法的執行緒都應該阻塞,等到同一個latch被呼叫兩次countDown後才能喚醒沉睡的執行緒。接著執行緒3和執行緒4執行了 await方法,這會的狀態圖如下:

這裡寫圖片描述

注意,上面的通知狀態是節點的屬性,表示該節點出隊後,必須喚醒其後續的節點執行緒。當執行緒1和執行緒2分別執行完latch.countDown方法後,會把state值置為0,此時,通過CAS成功置為0的那個執行緒將會同時承擔起喚醒佇列中第一個節點執行緒的任務,從上圖可以看出,第一個節點即為執行緒3,當執行緒3恢復執行之後,其發現狀態值為通知狀態,所以會喚醒後續節點,即執行緒4節點,然後執行緒3繼續做自己的事情,到這裡,執行緒3和執行緒4都已經被喚醒,CountDownLatch功成身退。

上面的流程,如果落實到程式碼,把 state置為0的那個執行緒,會判斷head指向節點的狀態,如果為通知狀態,則喚醒後續節點,即執行緒3節點,然後head指向執行緒3節點,head指向的舊節點會被刪除掉。當執行緒3恢復執行後,發現自身為通知狀態,又會把head指向執行緒4節點,然後刪除自身節點,並喚醒
執行緒4。

這裡可能讀者會有個疑問,執行緒節點的狀態是什麼時候設定上去的。其實,一個執行緒在阻塞之前,就會把它前面的節點設定為通知狀態,這樣便可以實現鏈式喚醒機制了。

結束語

本篇從CountDownLatch入手講解AQS中的共享鎖模式,主要是由CountDownLatch的實現相對簡單,但卻實現了共享鎖模型,如果在理解了模型的基礎上,從CountDownLatch入手來看AQS關於共享鎖的程式碼還比較好看懂,在看的時候,建議以看懂大致內容為主,學習其設計的思路,不要陷入所有條件處理細節中,多執行緒環境中,對與錯有時候不是那麼容易看出來的。

相關推薦

java共享實現原理CountDownLatch解析

前言 前面介紹了ReentrantLock,又叫排他鎖,本篇主要通過CountDownLatch的學習來了解java併發包中是如何實現共享鎖的。 CountDownLatch使用解說 CountDownLatch是java5中新增的一個併發工具類,

JAVA架構-SpringMVC實現原理解析

                               1、Spring mvc介紹 SpringMVC框架是以請求為驅動,圍繞Servlet設計,將請求發給控制器,然後通過模型物件,分派器來展示請求結果檢視。其中核心類是DispatcherServlet,它是一個S

Java併發--synchronized實現原理優化

注:本文中的部分內容摘抄自他人部落格,如有侵權,請聯絡我,侵刪~ 本篇部落格主要講述 synchronized 關鍵字的實現原理以及 JDK 1.6 後對 synchronized 的種種優化。synchronized 的使用不再贅述。 博主目前依舊存在

CountDownLatch共享實現原理

CountDownLatch使用解說CountDownLatch是java5中新增的一個併發工具類,其使用非常簡單,下面通過虛擬碼簡單看一下使用方式:這是一個使用CountDownLatch非常簡單的例子,建立的時候,需要指定一個初始狀態值,本例為2,主執行緒呼叫 latch

1.Java集合-HashMap實現原理源碼分析

int -1 詳細 鏈接 理解 dac hash函數 順序存儲結構 對象儲存   哈希表(Hash Table)也叫散列表,是一種非常重要的數據結構,應用場景及其豐富,許多緩存技術(比如memcached)的核心其實就是在內存中維護一張大的哈希表,而HashMap的實

CocurrentHashMap實現原理原始碼解析

##1、CocurrentHashMap概念      CocurrentHashMap是jdk中的容器,是hashmap的一個提升,結構圖: 這裡對比在對比hashmap的結構: 可以看出CocurrentHashMap對比HashMa

【原創】大資料基礎之Spark(5)Shuffle實現原理程式碼解析

一 簡介 Shuffle,簡而言之,就是對資料進行重新分割槽,其中會涉及大量的網路io和磁碟io,為什麼需要shuffle,以詞頻統計reduceByKey過程為例, serverA:partition1: (hello, 1), (word, 1)serverB:partition2: (hell

Go中定時器實現原理原始碼解析

> 轉載請宣告出處哦~,本篇文章釋出於luozhiyun的部落格:https://www.luozhiyun.com > > 本文使用的go的原始碼15.7,需要注意的是由於timer是1.14版本進行改版,但是1.14和1.15版本的timer並無很大區別 我在春節期間寫了一篇文章有關時間輪的:https

Java 中 synchronized 的實現原理偏向、輕量級、自旋、公平簡介

    在多執行緒程式設計中,synchronized 一直都是元老級別的存在,很多人都稱之為重量級鎖。本文來簡單介紹synchronized的實現原理,以及為減少獲得鎖和釋放鎖所帶來的效能損耗而引進的偏向鎖與輕量級鎖。     Java中使用synchronized來實現

java設計模式singleton原理實現

最新 不必要 -- 不同 適合 所有 引用 ati cnblogs 題外話:我要變強,要變強,變強,強。 1、 Singleton的應用場景以及為什麽要使用singleSingleton是一生只能有一個實例的對象。只能由singleton自身創建一個實例。外人是無法創建實例

InnoDB MVCC實現原理源碼解析

InnoDB MVCC1、原理介紹 數據多版本(MVCC)是MySQL實現高性能的一個主要的一個主要方式,通過對普通的SELECT不加鎖,直接利用MVCC讀取指版本的值,避免了對數據重復加鎖的過程。InnoDB支持MVCC多版本,其中RC和RR隔離級別是利用consistent read view方式支持的,

java基礎】ConcurrentHashMap實現原理原始碼分析

  ConcurrentHashMap是Java併發包中提供的一個執行緒安全且高效的HashMap實現(若對HashMap的實現原理還不甚瞭解,可參考我的另一篇文章),ConcurrentHashMap在併發程式設計的場景中使用頻率非常之高,本文就來分析下Concurre

java web自動登入原理實現

1、建立web工程2、建立使用者名稱、密碼的資料庫並建立對應的連線工廠及dao,service3、建立登入頁面(表單),含有記住密碼選項4、建立Servlet,接收登入引數,查詢資料庫,登入判斷,進行成功跳轉(歡迎頁面),     a、session記住登入使用者     b

Servlet實現前後端互動的原理過程解析

在日常除錯專案時,總是利用tomcat去啟動專案,並進行前後端聯調,但對於前後端的請求響應的互動原理及過程並不是特別清晰。 為什麼在前端發出相應請求,就能跳轉到後端通過程式得到結果再響應到前端頁面呢?! 為了加深對該過程的理解,故以tomcat為例,撰寫此文。 一、To

演算法---hash演算法原理(java中HashMap底層實現原理和原始碼解析)

散列表(Hash table,也叫雜湊表),是依據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。  比如我們要儲存八十八個資料,我們為他申請了100個

Spring-Session實現Session共享實現原理以及原始碼解析

知其然,還要知其所以然 ! 本篇介紹Spring-Session的整個實現的原理。以及對核心的原始碼進行簡單的介紹! 實現原理介紹 實現原理這裡簡單說明描述: 就是當Web伺服器接收到http請求後,當請求進入對應的Filter進行過濾,

演算法:CLH原理實現

一、背景 1.1 SMP(Symmetric Multi-Processor) 對稱多處理器結構,它是相對非對稱多處理技術而言的、應用十分廣泛的並行技術。在這種架構中,一臺計算機由多個CPU組成,並共享記憶體和其他資源,所有的CPU都可以平等地訪問記憶體、I/O

Java】重入 實現原理

ReentrantLock 是java繼synchronized關鍵字之後新出的執行緒鎖,今天看了看實現原始碼。主要是通過自旋來實現的。使用自旋的基本思路就是為所有的執行緒構建一個node,連成一個佇列,然後每一個node都輪詢前驅節點,如果前驅已經釋放鎖了,那麼當前階段就

Java三大器之攔截器(Interceptor)的實現原理程式碼示例

轉載 https://blog.csdn.net/reggergdsg/article/details/52962774 1,攔截器的概念     java裡的攔截器是動態攔截Action呼叫的物件,它提供了一種機制可以使開發者在一個Action執行的前後執行一段程式碼,也可以在一個Action 執

下拉重新整理、上拉載入更多控制元件實現原理解析(一)

以前那個賬號,以後可能不用了,把文章搬過來!!! 效果預覽 接受hi大頭鬼hi的建議,來一個動態圖,方便大家知道這是個什麼東西。 動機 原理     無論是下拉重新整理還是上拉載入更多,原理都是在內容View(ListView、Re