国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Java中的鎖「原理、鎖優化、CAS、AQS」

開發 后端
Java編程語言允許線程訪問共享變量, 為了確保共享變量能被準確和一致地更新,線程應該確保通過排他鎖單獨獲得這個變量。Java語言提供了volatile,在某些情況下比鎖要更加方便。

[[313098]]

一、為什么要用鎖?

鎖-是為了解決并發操作引起的臟讀、數據不一致的問題。

二、鎖實現的基本原理

2.1、volatile

Java編程語言允許線程訪問共享變量, 為了確保共享變量能被準確和一致地更新,線程應該確保通過排他鎖單獨獲得這個變量。Java語言提供了volatile,在某些情況下比鎖要更加方便。

volatile在多處理器開發中保證了共享變量的“ 可見性”。可見性的意思是當一個線程修改一個共享變量時,另外一個線程能讀到這個修改的值。

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

結論:如果volatile變量修飾符使用恰當的話,它比synchronized的使用和執行成本更低,因為它不會引起線程上下文的切換和調度。

2.2、synchronized

synchronized通過鎖機制實現同步。

先來看下利用synchronized實現同步的基礎:Java中的每一個對象都可以作為鎖。

具體表現為以下3種形式。

  • 對于普通同步方法,鎖是當前實例對象。
  • 對于靜態同步方法,鎖是當前類的Class對象。
  • 對于同步方法塊,鎖是Synchonized括號里配置的對象。

當一個線程試圖訪問同步代碼塊時,它首先必須得到鎖,退出或拋出異常時必須釋放鎖。

2.2.1 synchronized實現原理

synchronized是基于Monitor來實現同步的。

Monitor從兩個方面來支持線程之間的同步:

  • 互斥執行
  • 協作

1、Java 使用對象鎖 ( 使用 synchronized 獲得對象鎖 ) 保證工作在共享的數據集上的線程互斥執行。

2、使用 notify/notifyAll/wait 方法來協同不同線程之間的工作。

3、Class和Object都關聯了一個Monitor。

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

Monitor 的工作機理

  • 線程進入同步方法中。
  • 為了繼續執行臨界區代碼,線程必須獲取 Monitor 鎖。如果獲取鎖成功,將成為該監視者對象的擁有者。任一時刻內,監視者對象只屬于一個活動線程(The Owner)
  • 擁有監視者對象的線程可以調用 wait() 進入等待集合(Wait Set),同時釋放監視鎖,進入等待狀態。
  • 其他線程調用 notify() / notifyAll() 接口喚醒等待集合中的線程,這些等待的線程需要重新獲取監視鎖后才能執行 wait() 之后的代碼。
  • 同步方法執行完畢了,線程退出臨界區,并釋放監視鎖。

參考文檔:https://www.ibm.com/developerworks/cn/java/j-lo-synchronized

2.2.2 synchronized具體實現

1、同步代碼塊采用monitorenter、monitorexit指令顯式的實現。

2、同步方法則使用ACC_SYNCHRONIZED標記符隱式的實現。

通過實例來看看具體實現:

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

javap編譯后的字節碼如下:

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

monitorenter

每一個對象都有一個monitor,一個monitor只能被一個線程擁有。當一個線程執行到monitorenter指令時會嘗試獲取相應對象的monitor,獲取規則如下:

  • 如果monitor的進入數為0,則該線程可以進入monitor,并將monitor進入數設置為1,該線程即為monitor的擁有者。
  • 如果當前線程已經擁有該monitor,只是重新進入,則進入monitor的進入數加1,所以synchronized關鍵字實現的鎖是可重入的鎖。
  • 如果monitor已被其他線程擁有,則當前線程進入阻塞狀態,直到monitor的進入數為0,再重新嘗試獲取monitor。

monitorexit

只有擁有相應對象的monitor的線程才能執行monitorexit指令。每執行一次該指令monitor進入數減1,當進入數為0時當前線程釋放monitor,此時其他阻塞的線程將可以嘗試獲取該monitor。

2.2.3 鎖存放的位置

鎖標記存放在Java對象頭的Mark Word中。

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

Java對象頭長度

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

32位JVM Mark Word 結構

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

32位JVM Mark Word 狀態變化

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

64位JVM Mark Word 結構

2.2.3 synchronized的鎖優化

JavaSE1.6為了減少獲得鎖和釋放鎖帶來的性能消耗,引入了“偏向鎖”和“輕量級鎖”。

在JavaSE1.6中,鎖一共有4種狀態,級別從低到高依次是:無鎖狀態、偏向鎖狀態、輕量級鎖狀態和重量級鎖狀態,這幾個狀態會隨著競爭情況逐漸升級。

鎖可以升級但不能降級,意味著偏向鎖升級成輕量級鎖后不能降級成偏向鎖。這種鎖升級卻不能降級的策略,目的是為了提高獲得鎖和釋放鎖的效率。

偏向鎖:

無鎖競爭的情況下為了減少鎖競爭的資源開銷,引入偏向鎖。

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

輕量級鎖:

輕量級鎖所適應的場景是線程交替執行同步塊的情況。

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

鎖粗化(Lock Coarsening):也就是減少不必要的緊連在一起的unlock,lock操作,將多個連續的鎖擴展成一個范圍更大的鎖。

鎖消除(Lock Elimination):鎖削除是指虛擬機即時編譯器在運行時,對一些代碼上要求同步,但是被檢測到不可能存在共享數據競爭的鎖進行削除。

適應性自旋(Adaptive Spinning):自適應意味著自旋的時間不再固定了,而是由前一次在同一個鎖上的自旋時間及鎖的擁有者的狀態來決定。如果在同一個鎖對象上,自旋等待剛剛成功獲得過鎖,并且持有鎖的線程正在運行中,那么虛擬機就會認為這次自旋也很有可能再次成功,進而它將允許自旋等待持續相對更長的時間,比如100個循環。另一方面,如果對于某個鎖,自旋很少成功獲得過,那在以后要獲取這個鎖時將可能省略掉自旋過程,以避免浪費處理器資源。

2.2.4 鎖的優缺點對比

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

2.3、CAS

CAS,在Java并發應用中通常指CompareAndSwap或CompareAndSet,即比較并交換。

1、CAS是一個原子操作,它比較一個內存位置的值并且只有相等時修改這個內存位置的值為新的值,保證了新的值總是基于最新的信息計算的,如果有其他線程在這期間修改了這個值則CAS失敗。CAS返回是否成功或者內存位置原來的值用于判斷是否CAS成功。

2、JVM中的CAS操作是利用了處理器提供的CMPXCHG指令實現的。

優點:

  • 競爭不大的時候系統開銷小。

缺點:

  • 循環時間長開銷大。
  • ABA問題。
  • 只能保證一個共享變量的原子操作。

三、Java中的鎖實現

3.1、隊列同步器(AQS)

隊列同步器AbstractQueuedSynchronizer(以下簡稱同步器),是用來構建鎖或者其他同步組件的基礎框架。

3.1.1、它使用了一個int成員變量表示同步狀態。

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

3.1.2、通過內置的FIFO雙向隊列來完成獲取鎖線程的排隊工作。

同步器包含兩個節點類型的應用,一個指向頭節點,一個指向尾節點,未獲取到鎖的線程會創建節點線程安全(compareAndSetTail)的加入隊列尾部。同步隊列遵循FIFO,首節點是獲取同步狀態成功的節點。

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

未獲取到鎖的線程將創建一個節點,設置到尾節點。如下圖所示:

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

首節點的線程在釋放鎖時,將會喚醒后繼節點。而后繼節點將會在獲取鎖成功時將自己設置為首節點。如下圖所示:

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

3.1.3、獨占式/共享式鎖獲取

獨占式:有且只有一個線程能獲取到鎖,如:ReentrantLock;

共享式:可以多個線程同時獲取到鎖,如:CountDownLatch;

獨占式

  • 每個節點自旋觀察自己的前一節點是不是Header節點,如果是,就去嘗試獲取鎖。

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

  • 獨占式鎖獲取流程:

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

共享式:

  • 共享式與獨占式的區別:

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

  • 共享鎖獲取流程:

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

四、鎖的使用用例

4.1、ConcurrentHashMap的實現原理及使用

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

ConcurrentHashMap類圖

 

Java中的鎖「原理、鎖優化、CAS、AQS」

 

ConcurrentHashMap數據結構

結論:ConcurrentHashMap使用的鎖分段技術。首先將數據分成一段一段地存儲,然后給每一段數據配一把鎖,當一個線程占用鎖訪問其中一個段數據的時候,其他段的數據也能被其他線程訪問。

責任編輯:武曉燕 來源: 簡書
相關推薦

2019-11-28 16:00:06

重入鎖讀寫鎖樂觀鎖

2025-11-13 01:43:00

2023-10-13 00:00:00

并發樂觀鎖CAS

2009-12-08 10:07:29

2021-07-06 13:32:55

JVM

2024-01-29 01:08:01

悲觀鎖遞歸鎖讀寫鎖

2024-03-18 12:21:28

Java輕量級鎖重量級鎖

2018-10-25 15:55:44

Java多線程鎖優化

2025-11-10 08:41:06

2019-01-04 11:18:35

獨享鎖共享鎖非公平鎖

2010-05-24 11:26:27

MySQL鎖

2022-07-19 16:47:53

Android抖音

2015-03-31 14:47:22

JavaJava性能

2015-11-16 10:21:28

Java中鎖性能

2022-12-26 00:00:04

公平鎖非公平鎖

2022-07-04 08:01:01

鎖優化Java虛擬機

2021-03-18 08:04:54

AQS工具CAS

2011-03-21 13:10:01

OracleDDL鎖

2018-07-31 10:10:06

MySQLInnoDB死鎖

2013-06-06 13:10:44

HashMap無鎖
點贊
收藏

51CTO技術棧公眾號

欧美三级一级片| 欧美一二三四区在线| 蜜桃视频一区二区在线观看| 毛片av一区二区| av网站手机在线观看| heyzo一本久久综合| 男人天堂网视频| 激情六月婷婷久久| 美女黄色片网站| 蜜桃在线一区二区三区| 国产一区二区精品久久91| 国内自拍欧美激情| 日韩不卡视频在线观看| 欧美激情综合网| 欧美特级aaa| 捆绑调教美女网站视频一区| 欧美日韩喷水| 一本色道久久综合| 色吧亚洲视频| a亚洲天堂av| 久热久精久品这里在线观看 | 欧美日韩在线免费观看视频| 色噜噜狠狠色综合欧洲selulu | 婷婷激情综合网| 国模雨婷捆绑高清在线| 久久亚洲捆绑美女| 搞黄网站在线观看| 国产一区二区黑人欧美xxxx| 91国内精品| 亚洲欧美日韩精品综合在线观看| 中文欧美字幕免费| 精品欧美色视频网站在线观看| 日韩国产高清视频在线| 国产最新视频在线观看| 亚洲成人激情av| 2021av天天| 日韩综合小视频| 国产精品传媒毛片三区| 久久99久久精品欧美| 久久精品在线免费视频| 一区二区三区波多野结衣在线观看 | 国产999精品久久久影片官网| 日韩一级特黄| 国产91亚洲精品| 一道精品一区二区三区| 国产真实乱对白精彩久久| 很污的网站在线观看| 中文字幕一区二区三中文字幕| 天堂中文字幕在线| 亚洲午夜久久久久久久| 西瓜成人精品人成网站| 日本一区二区三区精品视频| 日本一二三不卡| 国产精品一级伦理| 亚洲欧美在线看| 羞羞色国产精品网站| 久久久久久九九| 国产视频一区二区在线观看| 日韩精品系列| 久久精视频免费在线久久完整在线看| 国产精品一区二区三区www| 一区二区三区回区在观看免费视频| 最新中文字幕在线播放| 国产中文字幕91| 成人看片黄a免费看视频| 久久青青草综合| 日韩欧美精品免费在线| 每日更新在线观看av| 2024亚洲男人天堂| 成人av电影免费观看| www视频在线观看| 一本色道久久99精品综合| 中文字幕在线观看不卡视频| 白嫩亚洲一区二区三区| 中文字幕在线亚洲三区| 国产精品美女久久久久久久| a级毛片免费观看在线| 粉嫩av一区二区三区免费观看 | 色青青草原桃花久久综合| 亚洲一区不卡在线| 亚洲高清福利视频| 青青国产91久久久久久 | 欧美国产小视频| 国产一区二区四区| 国产精品欧美久久久久无广告| 中文在线а√在线8| 国产精品一区二区免费| 91免费精品国自产拍在线不卡| 在线观看爽视频| 妺妺窝人体色www看人体| 亚洲人成亚洲人成在线观看图片 | 欧美日韩第二页| 国模精品系列视频| 欧美视频在线看| 999精品视频| 国产深夜视频在线观看| 欧美色图色综合| 亚洲国产成人久久综合一区| 99这里都是精品| 激情黄产视频在线免费观看| 中文字幕乱码免费| 免费成人在线观看视频| 先锋影音在线资源站91| 免费在线观看毛片网站| 国产精品美女久久久免费| 国内久久精品视频| 日韩深夜视频| 一级毛片免费视频| 国内一区二区在线视频观看| www.日韩.com| 国产女人aaa级久久久级| 欧美一区二区性| 91大神在线观看线路一区| 国产高清一级毛片在线不卡| 91专区在线观看| 国内精品一区二区| 国内免费精品永久在线视频| 欧美精品vⅰdeose4hd| 亚洲日本欧美天堂| 成人精品国产福利| 日本免费久久| 不卡一区中文字幕| 日本中文字幕伦在线观看| 欧美狂野激情性xxxx在线观| 2019国产精品视频| 国内精品一区二区三区四区| 亚洲免费av网址| 精品国产a毛片| 欧美性videosxxxxx| 成人免费高清观看| 日本一极黄色片| 日日骚一区二区网站| 成人资源视频网站免费| 国内精品久久久久影院 日本资源| 久久久精品tv| 成人免费在线播放| jizzjizzjizz欧美| 在线观看国产麻豆| 97中文字幕| 色佬视频在线观看| 中文字幕校园春色| 99视频精品免费| 日本不卡一区二区三区视频| 成人h视频在线观看| 国产精品自产拍高潮在线观看| 久久琪琪电影院| 97香蕉久久超级碰碰高清版| 青草热久免费精品视频| 日韩精品中文字幕久久臀| 日韩亚洲欧美在线观看| 精品视频1区2区3区| 欧美一区二区三区思思人 | 在线免费观看h| 免费在线观看黄| 韩国成人漫画| 亚洲永久精品唐人导航网址| 国产在线观看不卡| 久久青青草原一区二区| 三区精品视频观看| 中国一级大黄大黄大色毛片| 亚洲一区久久久| 成人资源av| 精品国产乱码久久久久| 久久av一区二区三区漫画| 国产精品第10页| 亚洲色图自拍| 中文字幕无码精品亚洲35| 一区二区三区网址| 中文日本在线观看| 51一区二区三区| 精品国产一区二区三区性色av| 国产精品成人自拍| 夜夜春成人影院| 亚洲欧美清纯在线制服| 国产偷国产偷精品高清尤物| 久久精品视频免费观看| 在线亚洲精品福利网址导航| 中文字幕一区二区精品| 国产福利成人在线| 天堂а√在线中文在线| 高清免费观看在线| 外国成人毛片| 美女国产精品| 一区二区在线观看视频| 视频一区视频二区中文| 狠狠色狠狠色综合系列| 日韩欧美国产中文字幕| 欧美激情中文网| 欧美一级在线播放| 亚洲bt天天射| 亚洲久久中文字幕| 一区二区三区日本视频| 免费在线观看一区二区三区| 亚洲午夜国产一区99re久久| 久久精品国产视频| 日产精品久久久久久久蜜臀| 51漫画成人app入口| 国产精品久久久久一区二区三区厕所| 久久精品无码一区二区三区| 欧美视频国产精品|