首頁 Java java教程 Java中的鎖--同步鎖與JUC包中的鎖

Java中的鎖--同步鎖與JUC包中的鎖

Jun 17, 2017 pm 02:18 PM
java 同步

這篇文章主要為大家詳細介紹了Java concurrency之鎖的相關資料,具有一定的參考價值,有興趣的小伙伴們可以參考一下

根據鎖的添加到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

  AbstractQueuedSynAQ

  AbstractQueuedSynAQ
##[]SynAQ非常有用的超類,可用來定義鎖以及依賴於排隊阻塞執行緒的其他同步器;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的子類別。 ReentrantReadWriteLock中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。

以上是Java中的鎖--同步鎖與JUC包中的鎖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP與Python:核心功能 PHP與Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP的影響:網絡開發及以後 PHP的影響:網絡開發及以後 Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP:許多網站的基礎 PHP:許多網站的基礎 Apr 13, 2025 am 12:07 AM

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

See all articles