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

最全Java鎖詳解:獨享鎖/共享鎖+公平鎖/非公平鎖+樂觀鎖/悲觀鎖

開發 后端
CAS全稱 Compare And Swap(比較與交換),是一種無鎖算法。在不使用鎖(沒有線程被阻塞)的情況下實現多線程之間的變量同步。java.util.concurrent包中的原子類就是通過CAS來實現了樂觀鎖。

[[254702]]

在Java并發場景中,會涉及到各種各樣的鎖如公平鎖,樂觀鎖,悲觀鎖等等,這篇文章介紹各種鎖的分類:

  • 公平鎖/非公平鎖
  • 可重入鎖
  • 獨享鎖/共享鎖
  • 樂觀鎖/悲觀鎖
  • 分段鎖
  • 自旋鎖

 

01.樂觀鎖 vs 悲觀鎖

樂觀鎖與悲觀鎖是一種廣義上的概念,體現了看待線程同步的不同角度,在Java和數據庫中都有此概念對應的實際應用。

1.樂觀鎖

顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。

樂觀鎖適用于多讀的應用類型,樂觀鎖在Java中是通過使用無鎖編程來實現,最常采用的是CAS算法,Java原子類中的遞增操作就通過CAS自旋實現的。

CAS全稱 Compare And Swap(比較與交換),是一種無鎖算法。在不使用鎖(沒有線程被阻塞)的情況下實現多線程之間的變量同步。java.util.concurrent包中的原子類就是通過CAS來實現了樂觀鎖。

簡單來說,CAS算法有3個三個操作數:

  • 需要讀寫的內存值 V。
  • 進行比較的值 A。
  • 要寫入的新值 B。

當且僅當預期值A和內存值V相同時,將內存值V修改為B,否則返回V。這是一種樂觀鎖的思路,它相信在它修改之前,沒有其它線程去修改它;而Synchronized是一種悲觀鎖,它認為在它修改之前,一定會有其它線程去修改它,悲觀鎖效率很低。

2.悲觀鎖

總是假設最壞的情況,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。

傳統的MySQL關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。詳情可以參考:阿里P8架構師談:MySQL行鎖、表鎖、悲觀鎖、樂觀鎖的特點與應用

再比如上面提到的Java的同步synchronized關鍵字的實現就是典型的悲觀鎖。

 

3.總之:

悲觀鎖適合寫操作多的場景,先加鎖可以保證寫操作時數據正確。

樂觀鎖適合讀操作多的場景,不加鎖的特點能夠使其讀操作的性能大幅提升。

02.公平鎖 vs 非公平鎖

1.公平鎖

就是很公平,在并發環境中,每個線程在獲取鎖時會先查看此鎖維護的等待隊列,如果為空,或者當前線程是等待隊列的***個,就占有鎖,否則就會加入到等待隊列中,以后會按照FIFO的規則從隊列中取到自己。

公平鎖的優點是等待鎖的線程不會餓死。缺點是整體吞吐效率相對非公平鎖要低,等待隊列中除***個線程以外的所有線程都會阻塞,CPU喚醒阻塞線程的開銷比非公平鎖大。

2.非公平鎖

上來就直接嘗試占有鎖,如果嘗試失敗,就再采用類似公平鎖那種方式。

非公平鎖的優點是可以減少喚起線程的開銷,整體的吞吐效率高,因為線程有幾率不阻塞直接獲得鎖,CPU不必喚醒所有線程。缺點是處于等待隊列中的線程可能會餓死,或者等很久才會獲得鎖。

 

3.典型應用:

java jdk并發包中的ReentrantLock可以指定構造函數的boolean類型來創建公平鎖和非公平鎖(默認),比如:公平鎖可以使用new ReentrantLock(true)實現。

03.獨享所 vs 共享鎖

1.獨享鎖

是指該鎖一次只能被一個線程所持有。

2.共享鎖

是指該鎖可被多個線程所持有。

3.比較

對于Java ReentrantLock而言,其是獨享鎖。但是對于Lock的另一個實現類ReadWriteLock,其讀鎖是共享鎖,其寫鎖是獨享鎖。

讀鎖的共享鎖可保證并發讀是非常高效的,讀寫,寫讀 ,寫寫的過程是互斥的。

獨享鎖與共享鎖也是通過AQS來實現的,通過實現不同的方法,來實現獨享或者共享。

4.AQS

抽象隊列同步器(AbstractQueuedSynchronizer,簡稱AQS)是用來構建鎖或者其他同步組件的基礎框架,它使用一個整型的volatile變量(命名為state)來維護同步狀態,通過內置的FIFO隊列來完成資源獲取線程的排隊工作。

 

concurrent包的實現結構如上圖所示,AQS、非阻塞數據結構和原子變量類等基礎類都是基于volatile變量的讀/寫和CAS實現,而像Lock、同步器、阻塞隊列、Executor和并發容器等高層類又是基于基礎類實現。

04.分段鎖

分段鎖其實是一種鎖的設計,并不是具體的一種鎖,對于ConcurrentHashMap而言,其并發的實現就是通過分段鎖的形式來實現高效的并發操作。

我們以ConcurrentHashMap來說一下分段鎖的含義以及設計思想,ConcurrentHashMap中的分段鎖稱為Segment,它即類似于HashMap(JDK7與JDK8中HashMap的實現)的結構,即內部擁有一個Entry數組,數組中的每個元素又是一個鏈表;同時又是一個ReentrantLock(Segment繼承了ReentrantLock)。

當需要put元素的時候,并不是對整個hashmap進行加鎖,而是先通過hashcode來知道他要放在那一個分段中,然后對這個分段進行加鎖,所以當多線程put的時候,只要不是放在一個分段中,就實現了真正的并行的插入。

但是,在統計size的時候,可就是獲取hashmap全局信息的時候,就需要獲取所有的分段鎖才能統計。

分段鎖的設計目的是細化鎖的粒度,當操作不需要更新整個數組的時候,就僅僅針對數組中的一項進行加鎖操作。

責任編輯:武曉燕 來源: 優知學院
相關推薦

2022-12-26 00:00:04

公平鎖非公平鎖

2022-07-12 08:56:18

公平鎖非公平鎖Java

2024-12-03 00:35:20

2024-01-29 01:08:01

悲觀鎖遞歸鎖讀寫鎖

2019-11-28 16:00:06

重入鎖讀寫鎖樂觀鎖

2022-05-09 07:37:04

Java非公平鎖公平鎖

2024-05-17 09:33:22

樂觀鎖CASversion

2018-07-31 10:10:06

MySQLInnoDB死鎖

2023-10-07 08:17:40

公平鎖非公平鎖

2018-07-31 15:05:51

Java公平鎖線程

2025-04-23 08:45:00

悲觀鎖樂觀鎖并發控制機制

2024-09-03 15:14:42

2020-08-24 08:13:25

非公平鎖源碼

2023-02-23 10:32:52

樂觀鎖

2011-08-18 13:44:42

Oracle悲觀鎖樂觀鎖

2020-09-16 07:56:28

多線程讀寫鎖悲觀鎖

2021-03-30 09:45:11

悲觀鎖樂觀鎖Optimistic

2009-09-25 16:43:44

Hibernate悲觀Hibernate樂觀

2020-07-06 08:03:32

Java悲觀鎖樂觀鎖

2021-07-02 08:51:09

Redisson分布式鎖公平鎖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线播放网站 | 精品久久久久久久久久久 | 国产成人福利视频 | 国产最新精品视频 | 久久99久久 | 国产精品久久久久久久久久免费看 | 中文字幕一区二区三区精彩视频 | 亚洲欧美一区二区三区1000 | 欧美精品一区二区三 | 国产伊人久久久 | 国产片侵犯亲女视频播放 | 国产高清一二三区 | 欧美日韩国产一区二区三区 | 丝袜美腿一区二区三区 | 久久伊人精品一区二区三区 | 免费播放一级片 | 国产 日韩 欧美 在线 | 亚洲视频一 | av色站 | 欧美日韩1区2区3区 欧美久久一区 | 欧美成人一级 | 欧美中文字幕一区 | 在线一区 | 国产 欧美 日韩 一区 | 中文字幕一区二区三区不卡 | 好姑娘影视在线观看高清 | 亚洲精品久久久久久宅男 | 日韩在线观看中文字幕 | 91视频在线 | 日韩欧美在线播放 | 精品久久久久一区二区国产 | 日韩中文一区二区三区 | av夜夜操 | 日韩不卡在线 | 免费观看一级特黄欧美大片 | 日韩资源 | 亚洲三级av| 欧美一级精品片在线看 | 电影在线 | 免费视频一区 | 国产精品精品久久久 |