Java多線程系列---“JUC鎖”01之 框架

?

本章,我們介紹鎖的架構;后面的章節將會對它們逐個進行分析介紹。目錄如下:

  • 01.?Java多線程系列--“JUC鎖”01之 框架
  • 02.?Java多線程系列--“JUC鎖”02之 互斥鎖ReentrantLock
  • 06.?Java多線程系列--“JUC鎖”03之 Condition條件
  • 07.?Java多線程系列--“JUC鎖”04之 LockSupport
  • 03.?Java多線程系列--“JUC鎖”05之 公平鎖(上)?
  • 04.?Java多線程系列--“JUC鎖”06之 公平鎖(下)?
  • 05.?Java多線程系列--“JUC鎖”07之 非公平鎖?

?

  • 08.?Java多線程系列--“JUC鎖”08之 共享鎖和ReentrantReadWriteLock (待更新)
  • 09.?Java多線程系列--“JUC鎖”09之 CountDownLatch原理和示例(待更新)
  • 10.?Java多線程系列--“JUC鎖”10之 CyclicBarrier原理和示例(待更新)
  • 11.?Java多線程系列--“JUC鎖”11之 Semaphore信號量的原理和示例(待更新)

根據鎖的添加到Java中的時間,Java中的鎖,可以分為"同步鎖"和"JUC包中的鎖"。

同步鎖

  即通過synchronized關鍵字來進行同步,實現對競爭資源的互斥訪問的鎖。Java 1.0版本中就已經支持同步鎖了。

  同步鎖的原理是,對于每一個對象,有且僅有一個同步鎖;不同的線程能共同訪問該同步鎖。但是,在同一個時間點,該同步鎖能且只能被一個線程獲取到。這樣,獲取到同步鎖的線程就能進行CPU調度,從而在CPU上執行;而沒有獲取到同步鎖的線程,必須進行等待,直到獲取到同步鎖之后才能繼續運行。這就是,多線程通過同步鎖進行同步的原理!

JUC包中的鎖?

  相比同步鎖,JUC包中的鎖的功能更加強大,它為鎖提供了一個框架,該框架允許更靈活地使用鎖,只是它的用法更難罷了。

  JUC包中的鎖,包括:Lock接口,ReadWriteLock接口,LockSupport阻塞原語,Condition條件,AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer三個抽象類,ReentrantLock獨占鎖,ReentrantReadWriteLock讀寫鎖。由于CountDownLatch,CyclicBarrier和Semaphore也是通過AQS來實現的;因此,我也將它們歸納到鎖的框架中進行介紹。

  先看看鎖的框架圖,如下所示。

01. Lock接口

  JUC包中的 Lock 接口支持那些語義不同(重入、公平等)的鎖規則。所謂語義不同,是指鎖可是有"公平機制的鎖"、"非公平機制的鎖"、"可重入的鎖"等等。"公平機制"是指"不同線程獲取鎖的機制是公平的",而"非公平機制"則是指"不同線程獲取鎖的機制是非公平的","可重入的鎖"是指同一個鎖能夠被一個線程多次獲取。

?

02. ReadWriteLock

  ReadWriteLock 接口以和Lock類似的方式定義了一些讀取者可以共享而寫入者獨占的鎖。JUC包只有一個類實現了該接口,即 ReentrantReadWriteLock,因為它適用于大部分的標準用法上下文。但程序員可以創建自己的、適用于非標準要求的實現。

?

03. AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer
  AbstractQueuedSynchronizer就是被稱之為AQS的類,它是一個非常有用的超類,可用來定義鎖以及依賴于排隊阻塞線程的其他同步器;ReentrantLock,ReentrantReadWriteLock,CountDownLatch,CyclicBarrier和Semaphore等這些類都是基于AQS類實現的。AbstractQueuedLongSynchronizer 類提供相同的功能但擴展了對同步狀態的 64 位的支持。兩者都擴展了類 AbstractOwnableSynchronizer(一個幫助記錄當前保持獨占同步的線程的簡單類)。


04. LockSupport
  LockSupport提供“創建鎖”和“其他同步類的基本線程阻塞原語”。?
  LockSupport的功能和"Thread中的Thread.suspend()和Thread.resume()有點類似",LockSupport中的park() 和 unpark() 的作用分別是阻塞線程和解除阻塞線程。但是park()和unpark()不會遇到“Thread.suspend 和 Thread.resume所可能引發的死鎖”問題。

?

05. Condition
  Condition需要和Lock聯合使用,它的作用是代替Object監視器方法,可以通過await(),signal()來休眠/喚醒線程。
Condition 接口描述了可能會與鎖有關聯的條件變量。這些變量在用法上與使用 Object.wait 訪問的隱式監視器類似,但提供了更強大的功能。需要特別指出的是,單個 Lock 可能與多個 Condition 對象關聯。為了避免兼容性問題,Condition 方法的名稱與對應的 Object 版本中的不同。

?

  06. ReentrantLock
  ReentrantLock是獨占鎖。所謂獨占鎖,是指只能被獨自占領,即同一個時間點只能被一個線程鎖獲取到的鎖。ReentrantLock鎖包括"公平的ReentrantLock"和"非公平的ReentrantLock"。"公平的ReentrantLock"是指"不同線程獲取鎖的機制是公平的",而"非公平的  ReentrantLock"則是指"不同線程獲取鎖的機制是非公平的",ReentrantLock是"可重入的鎖"。
  ReentrantLock的UML類圖如下:

  (01) ReentrantLock實現了Lock接口。
  (02) ReentrantLock中有一個成員變量sync,sync是Sync類型;Sync是一個抽象類,而且它繼承于AQS。
  (03) ReentrantLock中有"公平鎖類"FairSync和"非公平鎖類"NonfairSync,它們都是Sync的子類。ReentrantLock中sync對象,是FairSync與NonfairSync中的一種,這也意味著ReentrantLock是"公平鎖"或"非公平鎖"中的一種,ReentrantLock默認是非公平鎖。

?

07. ReentrantReadWriteLock
  ReentrantReadWriteLock是讀寫鎖接口ReadWriteLock的實現類,它包括子類ReadLock和WriteLock。ReentrantLock是一種獨占鎖,而WriteLock是共享鎖。
  ReentrantReadWriteLock的UML類圖如下:


  (01) ReentrantReadWriteLock實現了ReadWriteLock接口。
  (02) ReentrantReadWriteLock中包含sync對象,讀鎖readerLock和寫鎖writerLock。讀鎖ReadLock和寫鎖WriteLock都實現了Lock接口。
  (03) 和"ReentrantLock"一樣,sync是Sync類型;而且,Sync也是一個繼承于AQS的抽象類。Sync也包括"公平鎖"FairSync和"非公平鎖"NonfairSync。


08. CountDownLatch
  CountDownLatch是一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。?
  CountDownLatch的UML類圖如下:


  CountDownLatch包含了sync對象,sync是Sync類型。CountDownLatch的Sync是實例類,它繼承于AQS。

?

09. CyclicBarrier
  CyclicBarrier是一個同步輔助類,允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。因為該 barrier 在釋放等待線程后可以重用,所以稱它為循環 的 barrier。
  CyclicBarrier的UML類圖如下:


  CyclicBarrier是包含了"ReentrantLock對象lock"和"Condition對象trip",它是通過獨占鎖實現的。
  CyclicBarrier和CountDownLatch的區別是:
  (01) CountDownLatch的作用是允許1或N個線程等待其他線程完成執行;而CyclicBarrier則是允許N個線程相互等待。
  (02) CountDownLatch的計數器無法被重置;CyclicBarrier的計數器可以被重置后使用,因此它被稱為是循環的barrier。

?

10. Semaphore
  Semaphore是一個計數信號量,它的本質是一個"共享鎖"。
  信號量維護了一個信號量許可集。線程可以通過調用acquire()來獲取信號量的許可;當信號量中有可用的許可時,線程能獲取該許可;否則線程必須等待,直到有可用的許可為止。 線程可以通過release()來釋放它所持有的信號量許可。
  Semaphore的UML類圖如下:


  和"ReentrantLock"一樣,Semaphore包含了sync對象,sync是Sync類型;而且,Sync也是一個繼承于AQS的抽象類。Sync也包括"公平信號量"FairSync和"非公平信號量"NonfairSync。

轉載于:https://www.cnblogs.com/Hermioner/p/9905470.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450763.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450763.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450763.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IDEA配置jdk (SDK)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 提前安裝jdk,配置環境變量 一、配置jdk 1、依次點開File -->Project Structure,點擊左側標簽頁&#xff0c…

C、C++函數集 說明

第1章 數學函數 1.1 _chgsign——求參數的相反數 1.2 _copysign——復制數據 1.3 _hypot——求直角三角形斜邊長度 1.4 _max——求兩個數中的大數 1.5 _min——求兩個數中的小數 1.6 _scalb——求參數的(2^exp)倍數 1.7 abs——求整數的絕對值 1.8 acos——求…

讀書印記 - 《創新者的解答》

雖然作者寫書的意圖是教會大家如何完成顛覆式創新,但看完全書之后我覺得這個目標遠未達成,原因是作者的分析過于理論化,書中對于手機企業的發展建議即已被時間所否定。但如果標準放低,那這本書也確實總結出了不錯的顛覆式創新管理…

MinGW下編譯ffmpeg靜態庫給Visual C++使用

首先推薦 http://ffmpeg.zeranoe.com/builds/, 這里已經有編譯好的動態連接庫。可惜上面沒靜態鏈接庫。我也試過 DLL2Lib, 但是無法連接LIBCMT庫,只能使用MSVCRT 所以一定要靜態庫的話只能自己編譯了。在Windows上用MinGW編譯真是個痛苦的過程,沒有yum install和ap…

元模型是什么

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 元模型 元模型,是特定領域的模型,用于創建該領域中的模型的構建元素。典型的元模型結構可以分為四種:…

使用 NodeJS+Express+MySQL 實現簡單的增刪改查

關于node.js暫時記錄如下,以后有時間一定學習 文章來自簡書,作者:sprint,2016-07 使用 Node.js ExpressMySQL 實現簡單的增刪改查 https://www.jianshu.com/p/0a161f341771 使用 Node.js Express 開發服務端 https://www.jiansh…

zabbix安裝過程

安裝了兩天,zabbix監控服務器終于搭建好了。搭建過程中遇到過很多問題,都逐一解決了,好在有強大的網絡搜索,和網絡上牛人的優秀博客,讓我能夠不斷的解決問題。之前在虛擬機上裝過,覺得應該很簡單&#xff0…

Spring Data JPA入門

見:http://sishuok.com/forum/blogPost/list/7000.html Spring Data是什么 Spring Data是一個用于簡化數據庫訪問,并支持云服務的開源框架。其主要目標是使得對數據的訪問變得方便快捷,并支持map-reduce框架和云計算數據服務。 Spring Data…

劃分用戶故事(user-story)的原則

在敏捷開發過程中是通過用戶故事來將需求具體化成可以進行迭代開發的一個個現實的可見的開發任務。因此在敏捷軟件的開發過程中,用戶故事的劃分對于迭代和開發起著舉足輕重的作用。 用戶故事從其名字來看是站在用戶的角度所描述的故事,同時也是用戶所能看…

【git】----- clone 及上傳文件

在GitHub上創建一個項目首先點擊新存儲庫進入創建的步驟創建完成后跳轉到下一個頁面復制路徑然后在自己的新建的文件夾里面(例如:git)右鍵,點擊Git Bash Here進入命令行輸入 git clone 輸入剛剛拷貝的路徑(https://github.com/nam…

數據結構與算法總結

文章目錄線性數據結構1. 數組2. 鏈表2.1. 鏈表簡介2.2. 鏈表分類2.2.1. 單鏈表2.2.2. 循環鏈表2.2.3. 雙向鏈表2.2.4. 雙向循環鏈表2.3. 應用場景2.4. 數組 vs 鏈表3. 棧3.1. 棧簡介3.2. 棧的常見應用常見應用場景3.2.1. 實現瀏覽器的回退和前進功能3.2.2. 檢查符號是否成對出現…

使用 Spring Data JPA 簡化 JPA 開發

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 從一個簡單的 JPA 示例開始 本文主要講述 Spring Data JPA,但是為了不至于給 JPA 和 Spring 的初學者造成較大的學習曲線&am…

JS 取整、取余

一、取整 1. 取整 // 丟棄小數部分,保留整數部分 parseInt(7/2)  // 3 2. 向上取整 // 向上取整,有小數就整數部分加1 Math.ceil(7/2)  // 4 3. 向下取整 // 向下取整,丟棄小數部分 Math.floor(7/2)  // 3 4. 四舍五入 // 四舍五入 Math.round(7/2)  // 3 二、取余 // …

中國歷史朝代及皇帝簡介

一 、原始社會(約170萬年前到約公元前21世紀)  [詳細]約170萬年前 元謀人生活在云南元謀一帶       查看元謀人>>約70-20萬年前北京人生活在北京周口店一帶      查看北京人>>約1.8萬年前山頂洞人開始氏族公社的生活      …

Hadoop基礎-Hdfs各個組件的運行原理介紹

Hadoop基礎-Hdfs各個組件的運行原理介紹 作者:尹正杰 版權聲明:原創作品,謝絕轉載!否則將追究法律責任。 一.NameNode工作原理(默認端口號:50070) 1>.什么是NameNode NameNode管理文件系統的…

JPA入門例子(采用JPA的hibernate實現版本)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 (1)、JPA介紹: JPA全稱為Java Persistence API ,Java持久化API是Sun公司在Java EE 5規范…

IDEA詳細配置與使用

文章目錄一、IntelliJ IDEA 介紹二、查看安裝目錄結構三、查看設置目錄結構3.1 config目錄3.2 system目錄四、設置顯示常見的視圖1.工程界面展示2.如何刪除模塊3.查看項目配置五、常用配置1.Appearance & Behavior2. Editor - General3. Editor – Font4. Editor – Color …

M1905

11.09 11:00------102萬                          11.09 14:00---103萬 11.12 16:00------103萬                          11.19 16:00---94萬 11.20 16:00----94.9萬          …

前端又要失失失失失失失失失業了!

1. 禍起 看到標題,切圖仔們又是菊花一緊。前幾天微軟剛剛開源Sketch2Code,讓UI草圖轉化成HTML代碼。切圖仔瑟瑟發抖。 還沒等切圖仔調整好心情,號稱H5代碼生成工具的H5DS也開源了最新的代碼。 尼瑪,H5代碼都可以一鍵生成了&#x…

我是如何對研發和測試人員進行量化的績效考核的

我把硬件開發、軟件開發和測試人員的績效考核分成3部分,即重點工作、績效改進和績效浮動。下面分別進行說明它們的量化方法。1. 重點工作的績效量化方法重點工作的量化標準應從數量(包括文檔)、時間、質量和難度系數等多個維度來評定。…