成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java中的21種鎖,圖文并茂的詳細解釋

新聞 前端
Java中的樂觀鎖: CAS,比較并替換,比較當前值(主內(nèi)存中的值),與預期值(當前線程中的值,主內(nèi)存中值的一份拷貝)是否一樣,一樣則更新,否則繼續(xù)進行CAS操作。

 本篇主要內(nèi)容如下:

Java中的21種鎖,圖文并茂的詳細解釋

幫你總結(jié)好的

序號鎖名稱應用1樂觀鎖CAS2悲觀鎖synchronized、vector、hashtable3自旋鎖CAS4可重入鎖synchronized、Reentrantlock、Lock5讀寫鎖ReentrantReadWriteLock,CopyOnWriteArrayList、CopyOnWriteArraySet6公平鎖Reentrantlock(true)7非公平鎖synchronized、reentrantlock(false)8共享鎖ReentrantReadWriteLock中讀鎖9獨占鎖synchronized、vector、hashtable、ReentrantReadWriteLock中寫鎖10重量級鎖synchronized11輕量級鎖鎖優(yōu)化技術(shù)12偏向鎖鎖優(yōu)化技術(shù)13分段鎖concurrentHashMap14互斥鎖synchronized15同步鎖synchronized16死鎖相互請求對方的資源17鎖粗化鎖優(yōu)化技術(shù)18鎖消除鎖優(yōu)化技術(shù)。

1、樂觀

Java中的21種鎖,圖文并茂的詳細解釋

樂觀鎖

樂觀鎖是一種樂觀思想,假定當前環(huán)境是讀多寫少,遇到并發(fā)寫的概率比較低,讀數(shù)據(jù)時認為別的線程不會正在進行修改(所以沒有上鎖)。寫數(shù)據(jù)時,判斷當前 與期望值是否相同,如果相同則進行更新(更新期間加鎖,保證是原子性的)。

Java中的樂觀鎖: CAS,比較并替換,比較當前值(主內(nèi)存中的值),與預期值(當前線程中的值,主內(nèi)存中值的一份拷貝)是否一樣,一樣則更新,否則繼續(xù)進行CAS操作。

如上圖所示,可以同時進行讀操作,讀的時候其他線程不能進行寫操作。

2、悲觀鎖

Java中的21種鎖,圖文并茂的詳細解釋

悲觀鎖

悲觀鎖是一種悲觀思想,即認為寫多讀少,遇到并發(fā)寫的可能性高,每次去拿數(shù)據(jù)的時候都認為其他線程會修改,所以每次讀寫數(shù)據(jù)都會認為其他線程會修改,所以每次讀寫數(shù)據(jù)時都會上鎖。其他線程想要讀寫這個數(shù)據(jù)時,會被這個線程block,直到這個線程釋放鎖然后其他線程獲取到鎖。

Java中的悲觀鎖: synchronized修飾的方法和方法塊、ReentrantLock。

如上圖所示,只能有一個線程進行讀操作或者寫操作,其他線程的讀寫操作均不能進行。

3、自旋鎖

Java中的21種鎖,圖文并茂的詳細解釋

自旋鎖是一種技術(shù): 為了讓線程等待,我們只須讓線程執(zhí)行一個忙循環(huán)(自旋)。

現(xiàn)在絕大多數(shù)的個人電腦和服務器都是多路(核)處理器系統(tǒng),如果物理機器有一個以上的處理器或者處理器核心,能讓兩個或以上的線程同時并行執(zhí)行,就可以讓后面請求鎖的那個線程“稍等一會”,但不放棄處理器的執(zhí)行時間,看看持有鎖的線程是否很快就會釋放鎖。

自旋鎖的優(yōu)點: 避免了線程切換的開銷。掛起線程和恢復線程的操作都需要轉(zhuǎn)入內(nèi)核態(tài)中完成,這些操作給Java虛擬機的并發(fā)性能帶來了很大的壓力。

自旋鎖的缺點: 占用處理器的時間,如果占用的時間很長,會白白消耗處理器資源,而不會做任何有價值的工作,帶來性能的浪費。因此自旋等待的時間必須有一定的限度,如果自旋超過了限定的次數(shù)仍然沒有成功獲得鎖,就應當使用傳統(tǒng)的方式去掛起線程。

自旋次數(shù)默認值:10次,可以使用參數(shù)-XX:PreBlockSpin來自行更改。

自適應自旋: 自適應意味著自旋的時間不再是固定的,而是由前一次在同一個鎖上的自旋時間及鎖的擁有者的狀態(tài)來決定的。有了自適應自旋,隨著程序運行時間的增長及性能監(jiān)控信息的不斷完善,虛擬機對程序鎖的狀態(tài)預測就會越來越精準。

Java中的自旋鎖: CAS操作中的比較操作失敗后的自旋等待。

4、可重入鎖(遞歸鎖)

可重入鎖

可重入鎖是一種技術(shù): 任意線程在獲取到鎖之后能夠再次獲取該鎖而不會被鎖所阻塞。

可重入鎖的原理: 通過組合自定義同步器來實現(xiàn)鎖的獲取與釋放。

  • 再次獲取鎖:識別獲取鎖的線程是否為當前占據(jù)鎖的線程,如果是,則再次成功獲取。獲取鎖后,進行計數(shù)自增,
  • 釋放鎖:釋放鎖時,進行計數(shù)自減。

Java中的可重入鎖: ReentrantLock、synchronized修飾的方法或代碼段。

可重入鎖的作用: 避免死鎖。

面試題1: 可重入鎖如果加了兩把,但是只釋放了一把會出現(xiàn)什么問題?

答:程序卡死,線程不能出來,也就是說我們申請了幾把鎖,就需要釋放幾把鎖。

面試題2: 如果只加了一把鎖,釋放兩次會出現(xiàn)什么問題?

答:會報錯,java.lang.IllegalMonitorStateException。

5、讀寫鎖

讀寫鎖是一種技術(shù): 通過ReentrantReadWriteLock類來實現(xiàn)。為了提高性能, Java 提供了讀寫鎖,在讀的地方使用讀鎖,在寫的地方使用寫鎖,靈活控制,如果沒有寫鎖的情況下,讀是無阻塞的,在一定程度上提高了程序的執(zhí)行效率。讀寫鎖分為讀鎖和寫鎖,多個讀鎖不互斥,讀鎖與寫鎖互斥,這是由 jvm 自己控制的。

讀鎖: 允許多個線程獲取讀鎖,同時訪問同一個資源。

Java中的21種鎖,圖文并茂的詳細解釋

讀鎖

寫鎖: 只允許一個線程獲取寫鎖,不允許同時訪問同一個資源。

Java中的21種鎖,圖文并茂的詳細解釋

寫鎖

如何使用:

  1. /** 
  2. * 創(chuàng)建一個讀寫鎖 
  3. * 它是一個讀寫融為一體的鎖,在使用的時候,需要轉(zhuǎn)換 
  4. */ 
  5. private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); 

獲取讀鎖和釋放讀鎖

  1. // 獲取讀鎖 
  2. rwLock.readLock().lock();// 釋放讀鎖rwLock.readLock().unlock(); 

獲取寫鎖和釋放寫鎖

  1. // 創(chuàng)建一個寫鎖 
  2. rwLock.writeLock().lock();// 寫鎖 釋放rwLock.writeLock().unlock(); 

Java中的讀寫鎖:ReentrantReadWriteLock

6、公平鎖

Java中的21種鎖,圖文并茂的詳細解釋

公平鎖

公平鎖是一種思想: 多個線程按照申請鎖的順序來獲取鎖。在并發(fā)環(huán)境中,每個線程會先查看此鎖維護的等待隊列,如果當前等待隊列為空,則占有鎖,如果等待隊列不為空,則加入到等待隊列的末尾,按照FIFO的原則從隊列中拿到線程,然后占有鎖。

7、非公平鎖

Java中的21種鎖,圖文并茂的詳細解釋

非公平鎖

非公平鎖是一種思想: 線程嘗試獲取鎖,如果獲取不到,則再采用公平鎖的方式。多個線程獲取鎖的順序,不是按照先到先得的順序,有可能后申請鎖的線程比先申請的線程優(yōu)先獲取鎖。

優(yōu)點: 非公平鎖的性能高于公平鎖。

缺點: 有可能造成線程饑餓(某個線程很長一段時間獲取不到鎖)

Java中的非公平鎖:synchronized是非公平鎖,ReentrantLock通過構(gòu)造函數(shù)指定該鎖是公平的還是非公平的,默認是非公平的。

8、共享鎖

Java中的21種鎖,圖文并茂的詳細解釋

共享鎖

共享鎖是一種思想: 可以有多個線程獲取讀鎖,以共享的方式持有鎖。和樂觀鎖、讀寫鎖同義。

Java中用到的共享鎖: ReentrantReadWriteLock。

9、獨占鎖

Java中的21種鎖,圖文并茂的詳細解釋

獨占鎖

獨占鎖是一種思想: 只能有一個線程獲取鎖,以獨占的方式持有鎖。和悲觀鎖、互斥鎖同義。

Java中用到的獨占鎖: synchronized,ReentrantLock

10、重量級鎖

Java中的21種鎖,圖文并茂的詳細解釋

重量級鎖

重量級鎖是一種稱謂: synchronized是通過對象內(nèi)部的一個叫做監(jiān)視器鎖(monitor)來實現(xiàn)的,監(jiān)視器鎖本身依賴底層的操作系統(tǒng)的 Mutex Lock來實現(xiàn)。操作系統(tǒng)實現(xiàn)線程的切換需要從用戶態(tài)切換到核心態(tài),成本非常高。這種依賴于操作系統(tǒng) Mutex Lock來實現(xiàn)的鎖稱為重量級鎖。為了優(yōu)化synchonized,引入了輕量級鎖,偏向鎖。

Java中的重量級鎖: synchronized

11、輕量級鎖

Java中的21種鎖,圖文并茂的詳細解釋

輕量級鎖

輕量級鎖是JDK6時加入的一種鎖優(yōu)化機制: 輕量級鎖是在無競爭的情況下使用CAS操作去消除同步使用的互斥量。輕量級是相對于使用操作系統(tǒng)互斥量來實現(xiàn)的重量級鎖而言的。輕量級鎖在沒有多線程競爭的前提下,減少傳統(tǒng)的重量級鎖使用操作系統(tǒng)互斥量產(chǎn)生的性能消耗。如果出現(xiàn)兩條以上的線程爭用同一個鎖的情況,那輕量級鎖將不會有效,必須膨脹為重量級鎖。

優(yōu)點: 如果沒有競爭,通過CAS操作成功避免了使用互斥量的開銷。

缺點: 如果存在競爭,除了互斥量本身的開銷外,還額外產(chǎn)生了CAS操作的開銷,因此在有競爭的情況下,輕量級鎖比傳統(tǒng)的重量級鎖更慢。

12、偏向鎖

偏向鎖是JDK6時加入的一種鎖優(yōu)化機制: 在無競爭的情況下把整個同步都消除掉,連CAS操作都不去做了。偏是指偏心,它的意思是這個鎖會偏向于第一個獲得它的線程,如果在接下來的執(zhí)行過程中,該鎖一直沒有被其他的線程獲取,則持有偏向鎖的線程將永遠不需要再進行同步。持有偏向鎖的線程以后每次進入這個鎖相關(guān)的同步塊時,虛擬機都可以不再進行任何同步操作(例如加鎖、解鎖及對Mark Word的更新操作等)。

優(yōu)點: 把整個同步都消除掉,連CAS操作都不去做了,優(yōu)于輕量級鎖。

缺點: 如果程序中大多數(shù)的鎖都總是被多個不同的線程訪問,那偏向鎖就是多余的。

Java中的21種鎖,圖文并茂的詳細解釋

13、分段鎖

分段鎖

Java中的21種鎖,圖文并茂的詳細解釋

分段鎖是一種機制: 最好的例子來說明分段鎖是ConcurrentHashMap。ConcurrentHashMap原理:它內(nèi)部細分了若干個小的 HashMap,稱之為段(Segment)。默認情況下一個 ConcurrentHashMap 被進一步細分為 16 個段,既就是鎖的并發(fā)度。如果需要在 ConcurrentHashMap 添加一項key-value,并不是將整個 HashMap 加鎖,而是首先根據(jù) hashcode 得到該key-value應該存放在哪個段中,然后對該段加鎖,并完成 put 操作。在多線程環(huán)境中,如果多個線程同時進行put操作,只要被加入的key-value不存放在同一個段中,則線程間可以做到真正的并行。

線程安全:ConcurrentHashMap 是一個 Segment 數(shù)組, Segment 通過繼承ReentrantLock 來進行加鎖,所以每次需要加鎖的操作鎖住的是一個 segment,這樣只要保證每個 Segment 是線程安全的,也就實現(xiàn)了全局的線程安全

14、互斥鎖

Java中的21種鎖,圖文并茂的詳細解釋

互斥鎖

互斥鎖與悲觀鎖、獨占鎖同義,表示某個資源只能被一個線程訪問,其他線程不能訪問。

  • 讀-讀互斥
  • 讀-寫互斥
  • 寫-讀互斥
  • 寫-寫互斥

Java中的同步鎖: synchronized

15、同步鎖

Java中的21種鎖,圖文并茂的詳細解釋

同步鎖

同步鎖與互斥鎖同義,表示并發(fā)執(zhí)行的多個線程,在同一時間內(nèi)只允許一個線程訪問共享數(shù)據(jù)。

Java中的同步鎖: synchronized

16、死鎖

Java中的21種鎖,圖文并茂的詳細解釋

死鎖

死鎖是一種現(xiàn)象:如線程A持有資源x,線程B持有資源y,線程A等待線程B釋放資源y,線程B等待線程A釋放資源x,兩個線程都不釋放自己持有的資源,則兩個線程都獲取不到對方的資源,就會造成死鎖。

Java中的死鎖不能自行打破,所以線程死鎖后,線程不能進行響應。所以一定要注意程序的并發(fā)場景,避免造成死鎖。

17、鎖粗化

Java中的21種鎖,圖文并茂的詳細解釋

鎖粗化

鎖粗化是一種優(yōu)化技術(shù): 如果一系列的連續(xù)操作都對同一個對象反復加鎖和解鎖,甚至加鎖操作都是出現(xiàn)在循環(huán)體體之中,就算真的沒有線程競爭,頻繁地進行互斥同步操作將會導致不必要的性能損耗,所以就采取了一種方案:把加鎖的范圍擴展(粗化)到整個操作序列的外部,這樣加鎖解鎖的頻率就會大大降低,從而減少了性能損耗。

18、鎖消除

Java中的21種鎖,圖文并茂的詳細解釋

鎖消除

鎖消除是一種優(yōu)化技術(shù): 就是把鎖干掉。當Java虛擬機運行時發(fā)現(xiàn)有些共享數(shù)據(jù)不會被線程競爭時就可以進行鎖消除。

那如何判斷共享數(shù)據(jù)不會被線程競爭?

利用逃逸分析技術(shù):分析對象的作用域,如果對象在A方法中定義后,被作為參數(shù)傳遞到B方法中,則稱為方法逃逸;如果被其他線程訪問,則稱為線程逃逸。

在堆上的某個數(shù)據(jù)不會逃逸出去被其他線程訪問到,就可以把它當作棧上數(shù)據(jù)對待,認為它是線程私有的,同步加鎖就不需要了。

19、synchronized

Java中的21種鎖,圖文并茂的詳細解釋

synchronized

synchronized是Java中的關(guān)鍵字:用來修飾方法、對象實例。屬于獨占鎖、悲觀鎖、可重入鎖、非公平鎖。

  • 1.作用于實例方法時,鎖住的是對象的實例(this);
  • 2.當作用于靜態(tài)方法時,鎖住的是 Class類,相當于類的一個全局鎖, 會鎖所有調(diào)用該方法的線程;
  • 3.synchronized 作用于一個非 NULL的對象實例時,鎖住的是所有以該對象為鎖的代碼塊。它有多個隊列,當多個線程一起訪問某個對象監(jiān)視器的時候,對象監(jiān)視器會將這些線程存儲在不同的容器中。

每個對象都有個 monitor 對象, 加鎖就是在競爭 monitor 對象,代碼塊加鎖是在代碼塊前后分別加上 monitorenter 和 monitorexit 指令來實現(xiàn)的,方法加鎖是通過一個標記位來判斷的。

20、Lock和synchronized的區(qū)別

[[340724]]

自動擋和手動擋的區(qū)別

Lock: 是Java中的接口,可重入鎖、悲觀鎖、獨占鎖、互斥鎖、同步鎖。

  • 1.Lock需要手動獲取鎖和釋放鎖。就好比自動擋和手動擋的區(qū)別
  • 2.Lock 是一個接口,而 synchronized 是 Java 中的關(guān)鍵字, synchronized 是內(nèi)置的語言實現(xiàn)。
  • 3.synchronized 在發(fā)生異常時,會自動釋放線程占有的鎖,因此不會導致死鎖現(xiàn)象發(fā)生;而 Lock 在發(fā)生異常時,如果沒有主動通過 unLock()去釋放鎖,則很可能造成死鎖現(xiàn)象,因此使用 Lock 時需要在 finally 塊中釋放鎖。
  • 4.Lock 可以讓等待鎖的線程響應中斷,而 synchronized 卻不行,使用 synchronized 時,等待的線程會一直等待下去,不能夠響應中斷。
  • 5.通過 Lock 可以知道有沒有成功獲取鎖,而 synchronized 卻無法辦到。
  • 6.Lock 可以通過實現(xiàn)讀寫鎖提高多個線程進行讀操作的效率。

synchronized的優(yōu)勢:

  • 足夠清晰簡單,只需要基礎(chǔ)的同步功能時,用synchronized。
  • Lock應該確保在finally塊中釋放鎖。如果使用synchronized,JVM確保即使出現(xiàn)異常,鎖也能被自動釋放。
  • 使用Lock時,Java虛擬機很難得知哪些鎖對象是由特定線程鎖持有的。

21、ReentrantLock 和synchronized的區(qū)Lock、ReentrantLock、shnchronzied

ReentrantLock是Java中的類 : 繼承了Lock類,可重入鎖、悲觀鎖、獨占鎖、互斥鎖、同步鎖。

劃重點

相同點:

  • 1.主要解決共享變量如何安全訪問的問題
  • 2.都是可重入鎖,也叫做遞歸鎖,同一線程可一個鎖,
  • 3.保證了線程安全的兩大特性:可見性、原子性。

不同點:

  • 1.ReentrantLock 就像手動汽車,需要顯示的調(diào)用lock和unlock方法, synchronized 隱式獲得釋放鎖。
  • 2.ReentrantLock 可響應中斷, synchronized 是不可以響應中斷的,ReentrantLock 為處理鎖的不可用性提供了更高的靈活性
  • 3.ReentrantLock 是 API 級別的, synchronized 是 JVM 級別的
  • 4.ReentrantLock 可以實現(xiàn)公平鎖、非公平鎖,默認非公平鎖,synchronized 是非公平鎖,且不可更改。
  • 5.ReentrantLock 通過 Condition 可以綁定多個條件

 

責任編輯:張燕妮 來源: 今日頭條
相關(guān)推薦

2023-09-27 08:46:44

Java 技術(shù)編程語言

2012-05-28 15:32:05

PHP

2019-05-05 10:15:42

悲觀鎖樂觀鎖數(shù)據(jù)安全

2022-07-25 06:44:19

ZooKeeper分布式鎖

2022-07-18 14:33:05

PythonPDF報告

2012-05-29 14:27:34

PHP

2011-11-21 15:12:54

Java斷點Eclipse

2011-01-18 18:08:28

Thunderbird

2011-01-18 18:29:28

Thunderbird

2023-05-16 08:01:13

架構(gòu)網(wǎng)站演進

2012-07-23 14:39:27

移動

2011-01-19 17:30:21

Postfix郵件投遞

2011-01-19 17:34:39

Postfix如何接收郵件

2011-01-20 09:13:18

Postfix

2021-12-27 08:04:49

架構(gòu)網(wǎng)站高并發(fā)

2011-01-21 10:28:06

2011-01-19 10:30:20

UbuntuThunderbird

2012-07-27 10:27:19

OfficeWord

2011-08-03 15:21:23

ORM XCode 數(shù)據(jù)庫

2022-04-20 18:30:00

算法架構(gòu)粗排
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲不卡在线观看 | 欧美日韩精品一区二区三区蜜桃 | 日本黄色免费视频 | 91免费电影| 国产精品区一区二区三区 | 大学生a级毛片免费视频 | 精品久久中文 | 99久久精品国产一区二区三区 | 天天操伊人| 国产精品久久久久久久久久久免费看 | 欧美一级艳情片免费观看 | 99视频免费在线 | 日韩在线精品视频 | 欧美白人做受xxxx视频 | 国产成都精品91一区二区三 | 免费国产黄 | 亚洲国产一区二区三区 | 精品99在线 | 中文字幕一区二区三区精彩视频 | 五月婷婷中文 | 午夜精品久久久久久久 | 成人在线小视频 | 青草青草久热精品视频在线观看 | 99精品久久 | 精品免费国产一区二区三区四区介绍 | 国外成人在线视频 | 国产欧美日韩久久久 | 日韩一区在线播放 | 国产一区二区三区四区 | 亚洲精品在线免费 | 在线观看精品 | 波多野结衣中文字幕一区二区三区 | 亚洲国产精品久久久 | 一区二区在线免费观看 | 91综合在线观看 | 精品亚洲一区二区 | 国产高清一区二区三区 | 一区二区在线不卡 | 亚洲www啪成人一区二区麻豆 | 国产精品爱久久久久久久 | 中文精品视频 |