精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Synchronized 天天用,實現原理你懂嗎?

開發 后端
Synchronized 關鍵字算是Java的元老級鎖了,一開始它撐起了Java的同步任務,其用法簡單粗暴容易上手。但是有些與它相關的知識點還是需要我們開發者去深入掌握的。

Synchronized 關鍵字算是Java的元老級鎖了,一開始它撐起了Java的同步任務,其用法簡單粗暴容易上手。但是有些與它相關的知識點還是需要我們開發者去深入掌握的。

比如,我們都知道通過 Synchronized 鎖來實現互斥功能,可以用在方法或者代碼塊上,那么不同用法都是怎么實現的,以及都經歷了了哪些優化等等問題都需要我們扎實的理解。

[[338885]]

一、基本用法

通常我們可以把 Synchronized 用在一個方法或者代碼塊里,方法又有普通方法或者靜態方法。

對于普通同步方法,鎖是當前實例對象,也就是this

  1. public class TestSyn{ 
  2.   private int i=0
  3.   public synchronized void incr(){ 
  4.     i++; 
  5.   } 

對于靜態同步方法,鎖是Class對象

  1. public class TestSyn{ 
  2.   private static int i=0
  3.   public static synchronized void incr(){ 
  4.     i++; 
  5.   } 
  6. }   

對于同步代碼塊,鎖是同步代碼塊里的對象

  1. public class TestSyn{ 
  2.   private  int i=0
  3.   Object o = new Object(); 
  4.   public  void incr(){ 
  5.     synchronized(o){ 
  6.         i++; 
  7.     } 
  8.   } 

二、實現原理

在JVM規范中介紹了 Synchronized 的實現原理,JVM基于進入和退出Monitor對象來實現方法同步和代碼塊同步,但兩者的實現細節不一樣。

代碼塊同步是使用monitorenter和monitorexit指令實現的,而方法同步是使用另外一種方式實現的,通過一個方法標志(flag) ACC_SYNCHRONIZED來實現的。

1. 同步代碼塊的實現

(1) monitorenter 和 monitorexit

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.monitorenter (參考來源)

下面看下JVM規范里對moniterenter 和 monitorexit的介紹:

Each object has a monitor associated with it. The thread that executes monitorenter gains ownership of the monitor associated with objectref. If another thread already owns the monitor associated with objectref, the current thread waits until the object is unlocked,

每個對象都有一個監視器(Moniter)與它相關聯,執行moniterenter指令的線程將獲得與objectref關聯的監視器的所有權,如果另一個線程已經擁有與objectref關聯的監視器,則當前線程將等待直到對象被解鎖為止。

A monitorenter instruction may be used with one or more monitorexit instructions to implement a synchronized statement in the Java programming language. The monitorenter and monitorexit instructions are not used in the implementation of synchronized methods

重點來了,上面這段介紹了兩點:

  • 通過monitorenter和monitorexit指令來實現Java語言的同步代碼塊(后面有代碼示例)
  • monitorenter和monitorexit指令沒有被用在同步方法上!!!

Synchronized 天天用,實現原理你懂嗎?

2. 同步方法的實現

先看下JVM規范里怎么說的:

https://docs.oracle.com/javase/specs/jvms/se6/html/Compiling.doc.html#6530 (參考來源)

A synchronized method is not normally implemented using monitorenter and monitorexit. Rather, it is simply distinguished in the runtime constant pool by the ACC_SYNCHRONIZED flag, which is checked by the method invocation instructions. When invoking a method for which ACC_SYNCHRONIZED is set, the current thread acquires a monitor, invokes the method itself, and releases the monitor whether the method invocation completes normally or abruptly.

上面這段話主要講了幾點:

  • 同步方法的實現不是基于monitorenter和monitorexit指令來實現的
  • 在運行時常量池里通過ACC_SYNCHRONIZED來區分是否是同步方法,方法執行時會檢查該標志
  • 當一個方法有這個標志的時候,進入的線程首先需要獲得監視器才能執行該方法
  • 方法結束或者拋異常時會釋放監視器
  1. public class TestSyn { 
  2.  
  3.     private int i=0
  4.     // 同步方法 
  5.     public synchronized void incer(){ 
  6.         i++; 
  7.     } 
  8.     // 同步代碼塊 
  9.     public  void decr(){ 
  10.         synchronized (this) { 
  11.             i--; 
  12.         } 
  13.     } 

可以通過反編譯字節碼來查看底層是怎么實現的

  1. // 得到字節碼 
  2. javac TestSyn.java 
  1. // 反編譯字節碼 
  2. javap -v TestSyn.class 

同步代碼塊的反編譯結果如下:

Synchronized 天天用,實現原理你懂嗎?

同步方法的反編譯結果如下:

Synchronized 天天用,實現原理你懂嗎?

三、鎖升級

1. Java對象頭介紹

(1) 對象的內存布局

在我們常見的HotSpot虛擬機中對象由三部分組成,分別是對象頭,實例數據,以及對齊填充位。

其中對象頭是跟鎖信息相關的部分,在對象頭里會存儲該對象運行時數據,包括哈希碼,GC分代年齡,鎖狀態(無鎖,偏向鎖,輕量級鎖,重量級鎖),是否偏向鎖,偏向線程ID等信息。

存儲上述這些的區域叫做Mark Word(標記詞),除了這部分對象頭還有一部分區域用來存儲類型指針,可以通過該類型指針來定位對象的元數據信息。下面重點看下,對象頭的內存布局,因為這部分是跟我們這次相關的。

對象在內存中的表示如下圖:

Synchronized 天天用,實現原理你懂嗎?

對象頭的結構表示如下圖:

Synchronized 天天用,實現原理你懂嗎?

mark word的表示如下圖:

Synchronized 天天用,實現原理你懂嗎?

2. 什么是鎖升級

下面舉個搶茅坑的例子來解釋一下鎖升級過程。

(1) 當只有一個線程訪問時叫做偏向鎖

假設我們每個廁所都有一把鑰匙,要想使用廁所首先必須得獲得鎖。某天上午員工甲急急忙忙的打完卡上廁所了,并在廁所門上貼了 “工號007使用中”的標簽,說明目前被工號007(相當于線程id)的員工占用呢,他再次向進入的時候只要上面的標簽還顯示工號007,他自己可以隨便進入,不需要再次上鎖了,有點偏向工號007員工的意思,所以這叫偏向鎖。

(2) 發生競爭的時候升級成輕量級鎖 (自旋等待)

員工甲正在使用廁所的時候,又來了兩個人想用廁所,但發現廁所被人使用著呢,無法獲得鎖。所以只能在外面等著甲出來,他們等的過程叫做“自旋”,這個叫做輕量級鎖。

那么又有一個問題,當甲出來之后正等著的那兩個人誰活得鎖呢?有兩種方式,按到達的順序來排隊或者不排隊,這兩種都可以實現,前者叫做公平鎖,后者叫做非公平鎖。

(3) 自旋等待沒結果的時候升級成重量級鎖

但那兩個人自旋一段時間之后發現甲還沒出來(JDK1.6規定為10次),一直這么等也不是個法子啊,所以打算向上升級,找廁所管理員(操作系統)反饋,升級成了重量級鎖了。

鎖的狀態總共有四種,無鎖狀態、偏向鎖、輕量級鎖和重量級鎖。隨著鎖的競爭,鎖可以從偏向鎖升級到輕量級鎖,再升級的重量級鎖。另外關注公眾號Java技術棧回復JVM46獲取一份46頁的JVM調優教程。

Synchronized 天天用,實現原理你懂嗎?

鎖升級過程中mark word的變化如下:

Synchronized 天天用,實現原理你懂嗎?

(4) 偏向鎖

偏向鎖也是JDK 1.6中引入的一項鎖優化, 引入它是為了優化在沒有鎖競爭場景下的鎖消除。比如一段同步代碼一直是由單個線程調用,在這種場景下就沒必要使用同步鎖了,這里指的同步鎖不是指 synchronized,而是說沒不要到操作系統層面的互斥量了。

偏向鎖的偏向是指該同步代碼會一直偏向第一個調用它的線程,直到有別的線程過來競爭這把鎖,在第一次調用同步代碼并獲得鎖時會在對象頭和棧幀鎖記錄行(Lock Record)里存儲偏向線程Id,該線程在此進入的時候就不需要重新申請鎖了。只需檢測對象頭的Mark Word里是否存儲著指向該線程的ID即可。

直到又有線程來競爭這把鎖的時候偏向鎖會撤銷偏向。

Synchronized 天天用,實現原理你懂嗎?

Synchronized 天天用,實現原理你懂嗎?

(5) 輕量級鎖

輕量級鎖是JDK 1.6之中加入的新型鎖機制, 它名字中的“輕量級”是相對于使用操作系統。

互斥量來實現的傳統鎖而言的, 因此傳統的鎖機制就稱為“重量級”鎖。它并不是用來代替重量級鎖的, 它的本意是在統的重量級鎖使用操作系統互斥量產生的性能消耗。

線程在執行同步塊之前,JVM會先在當前線程的棧楨中創建用于存儲鎖記錄的空間,并將對象頭中的Mark Word復制到鎖記錄中,官方稱為Displaced Mark Word。

然后線程嘗試使用CAS將對象頭中的Mark Word替換為指向鎖記錄的指針。如果成功,當前線程獲得鎖,如果失敗,表示其他線程競爭鎖,當前線程便嘗試使用自旋來獲取鎖.一直原地自旋,如果自旋數達到10次了則升級為重量級鎖。

(6) 重量級鎖

競爭的線程自旋一段時間未能獲取鎖之后會升級為重量級鎖,這個時候鎖的獲取與釋放都會由操作系統來分配了,如果持有鎖的線程釋放鎖之后操作系統會喚醒所有阻塞的那些線程,并進入新一輪的爭搶模式,需要注意的是這些阻塞的線程沒有獲得鎖的優先級,也就是說synchronized鎖是非公平的。

除此之外synchronized對中斷操作也是無感的,不會因為被中斷而放棄阻塞等待,它要么得到鎖要么一直阻塞。

 

責任編輯:趙寧寧 來源: 博客園
相關推薦

2019-09-06 09:11:36

以太網數據二層交換

2017-12-06 16:28:48

Synchronize實現原理

2021-01-08 08:34:09

Synchronize線程開發技術

2025-03-20 06:48:55

性能優化JDK

2021-07-04 08:01:30

Synchronize線程安全并發編程

2022-12-26 09:27:48

Java底層monitor

2019-11-28 10:45:28

ZooKeeper源碼分布式

2019-09-09 09:30:59

Git行程Linux

2015-05-26 11:10:45

沃爾瑪OpenStack

2020-12-29 16:55:44

ZooKeeper運維數據結構

2019-09-03 09:19:34

CPU架構內核

2017-02-27 10:43:07

Javasynchronize

2020-08-13 09:55:37

Stream代碼Java

2021-01-11 15:02:27

Redis數據庫命令

2010-08-29 21:09:57

DHCP協議

2024-03-07 07:47:04

代碼塊Monitor

2022-07-18 07:12:33

開源Linux

2020-09-16 06:09:43

開源工具PulpLinux

2024-03-15 15:12:27

關鍵字底層代碼

2023-05-10 08:29:28

Spring配置原理
點贊
收藏

51CTO技術棧公眾號

一级二级黄色片| 欧美变态另类刺激| www.黄色小说.com| 亚洲精品少妇| 亚洲欧美精品中文字幕在线| 成年人免费大片| 免费黄色网址在线观看| 成人免费av网站| 欧洲精品中文字幕| 一区二区在线不卡| 秋霞av鲁丝片一区二区| 婷婷久久一区| 亚洲国产成人久久| 91极品尤物在线播放国产| 亚洲图区一区| 欧美激情一区二区三区四区| 亚洲综合中文字幕在线观看| 国产成人精品一区二三区| 欧美第十八页| 亚洲女在线观看| 中文字幕一二三| 黄色精品视频| 欧美日韩美女视频| 国产三级中文字幕| 美国一级片在线免费观看视频 | 色综合视频一区中文字幕| 亚洲国产无码精品| 1769国产精品视频| 欧美精品在线视频| 毛葺葺老太做受视频| 国产探花在线观看| 亚洲欧洲综合另类在线| 视频一区三区| 香蕉视频免费在线看| 国产一区二区日韩精品| 国产精品久久久久久久7电影| 日产电影一区二区三区| 麻豆国产一区| 日本丶国产丶欧美色综合| cao在线观看| 污网站在线免费看| 亚洲欧美成人一区二区三区| 亚洲国产精品一区二区第四页av| 波多野结衣网站| 国产精品vip| 久久综合久久八八| 久久av红桃一区二区禁漫| 欧美一级淫片| 亚洲欧美日韩精品久久亚洲区| 国产视频精品视频| 在线视频亚洲欧美中文| 日韩欧美一级二级三级久久久| 男人添女荫道口喷水视频| 日韩免费啪啪| 国产精品综合久久| 91久久精品国产91久久| 亚洲一区二区色| 久草热8精品视频在线观看| 国产精品久久9| 欧美在线视频精品| 免费成人在线视频观看| 国产精品亚洲自拍| 亚洲一区二区三区高清视频| 精品一区二区日韩| 亚洲精品日产aⅴ| 99精品免费观看| 国产河南妇女毛片精品久久久 | 国产农村妇女精品| 日日骚一区二区网站| 91精品国产综合久久久久久豆腐| 国产精品欧美一级免费| 在线免费观看成人| av大大超碰在线| 亚洲影院理伦片| 欧洲黄色一级视频| 色综合天天色| 欧美一区二区三区在线| 国产a级片视频| 首页亚洲中字| 一区二区三区四区精品| 99鲁鲁精品一区二区三区| 欧美福利网址| 精品偷拍各种wc美女嘘嘘| 欧美色图亚洲激情| 日韩伦理一区| 欧美国产第一页| 成人免费看片98欧美| 久久经典综合| 91中文在线观看| 性插视频在线观看| 国产精品久久久久久久浪潮网站 | 国产精品一在线观看| 深夜福利日韩在线看| 免费中文字幕视频| 视频在线观看91| 69174成人网| 日韩av免费观影| 亚洲欧洲日产国码二区| 国产亚洲黄色片| 欧美成人视屏| 性做久久久久久免费观看| 免费日韩中文字幕| 日韩08精品| 亚洲毛片一区二区| 欧美一区免费观看| 美女国产一区| 97视频资源在线观看| 成年人在线看| 午夜视频在线观看一区二区三区| 久久婷婷国产91天堂综合精品| 精品91福利视频| 亚洲色图18p| 欧美成人黄色网| 免费高清不卡av| 玛丽玛丽电影原版免费观看1977 | 麻豆短视频在线观看| 精品精品久久| 亚洲午夜性刺激影院| 午夜免费激情视频| 日韩av在线播放中文字幕| 国内精品视频在线播放| av中文字幕在线观看| 色88888久久久久久影院野外| 9191在线视频| 99久久激情| 国产福利视频一区二区| 人妻无码中文字幕| 亚洲在线免费播放| 天天做天天干天天操| 国产精品欧美一区二区三区不卡 | 屁屁影院国产第一页| 综合久久99| 91精品国产综合久久男男| 免费观看成年在线视频网站| 性做久久久久久久免费看| 一级做a爱视频| 久久综合99| 国产精品网红直播| 成人动漫在线免费观看| 日本韩国一区二区三区视频| 国产精品三级在线观看无码| 91久久亚洲| 国产经品一区二区| 毛片大全在线观看| 精品欧美久久久| 变态另类丨国产精品| 欧美日本精品| 97人人干人人| xxxcom在线观看| 精品盗摄一区二区三区| 久久免费精彩视频| 国产成人av在线影院| 大胆欧美熟妇xx| 国产精品传媒| 午夜精品国产精品大乳美女| 日韩一级中文字幕| 欧美性猛xxx| 亚洲区自拍偷拍| 日本va欧美va瓶| 亚洲色图自拍| 成人ssswww在线播放| 亚洲第一黄色网| 国产精品xxxx喷水欧美| 丝袜国产日韩另类美女| 欧美性色黄大片人与善| 欧美日韩在线精品一区二区三区激情综合| 亚洲人成在线观| 自拍偷拍第八页| 日韩理论片中文av| a级片在线观看视频| 国产欧美日本| 日韩中文字幕av在线| 色999久久久精品人人澡69| 久久精品美女视频网站| 精品人妻少妇AV无码专区 | 91黑人精品一区二区三区| 国产日产精品一区| 久久精品国产露脸对白| 亚洲国产黄色| 日韩精品一区二区三区四区五区| 欧美久久久网站| 日韩黄色av网站| 在线观看亚洲欧美| 国产精品无遮挡| www.色.com| 国产视频亚洲| 亚洲一区二区三区色| 在线日韩成人| 国产精品久久久久久久天堂 | 色诱色偷偷久久综合| 欧美精品在线第一页| 日韩精品视频在线观看一区二区三区| 欧美亚男人的天堂| 欧美极品视频在线观看| 久久久久国产精品麻豆| 免费高清视频在线观看| 亚洲专区一区二区三区| 国产不卡一区二区在线观看 | 69亚洲乱人伦| 另类小说一区二区三区| 人妻夜夜添夜夜无码av| 日韩欧美一区免费| 精品久久久久久综合日本| 九九九精品视频| 91a在线视频| 福利视频在线| 国产亚洲精品一区二555| 高h调教冰块play男男双性文| 成人欧美一区二区三区白人| 欧美xxxxx少妇| 国内外成人在线| 激情综合网婷婷| 亚洲网站视频| 综合一区中文字幕| 在线看成人短视频| 国产一区自拍视频| 国产精品亚洲四区在线观看| 国产不卡一区二区在线播放| 黑人极品ⅴideos精品欧美棵| 日韩中文理论片| 毛片免费在线| 亚洲国产精品福利| 国产黄色一区二区| 欧美日韩国产综合草草| 久久青青草原亚洲av无码麻豆| 亚洲精品久久嫩草网站秘色| www中文在线| 久久精品视频网| 性色av蜜臀av色欲av| 成人激情黄色小说| 女人扒开腿免费视频app| 久久精品国产精品亚洲红杏| 一区二区在线播放视频| 亚洲影视在线| 久久无码高潮喷水| 日韩一级不卡| 少妇人妻无码专区视频| 激情综合电影网| 999一区二区三区| 欧美理论在线| 激情五月婷婷六月| 国模一区二区三区| 日韩精品一区二区三区四| 综合久久婷婷| 成人国产在线看| 欧美大片网址| 精品国产免费一区二区三区| 成人av激情人伦小说| 成人黄视频免费| 成人av影音| 国内视频一区| 西瓜成人精品人成网站| 欧美激情第六页| 九九亚洲视频| 亚洲高清视频在线观看| 日韩精品水蜜桃| 最新国产精品久久| 你懂的国产精品| 亚洲精品蜜桃久久久久久| 亚洲激情网址| 欧美一级黄色片视频| 日韩成人伦理电影在线观看| 尤蜜粉嫩av国产一区二区三区| 日本伊人午夜精品| 最新免费av网址| 国产成人亚洲精品青草天美| 日韩综合第一页| 26uuu欧美日本| 日本高清黄色片| 亚洲情趣在线观看| 久久久久成人精品无码| 精品毛片三在线观看| 天天操天天干天天摸| 欧美久久久久久久久久 | 日韩成人性视频| 国产人成在线视频| 久久夜精品香蕉| 岛国av在线网站| 国产精品久久久久久久久| 精品一区二区三区免费看| 国产日本一区二区三区| 国内精品久久久久久久久电影网| 日本黄色播放器| 日韩视频中文| 少妇一级淫免费放| 国产a区久久久| 久久久视频6r| 亚洲同性同志一二三专区| 日韩欧美大片在线观看| 欧美性受xxxx黑人xyx性爽| 国产成人av免费看| 亚洲美女黄色片| gogo在线高清视频| 秋霞av国产精品一区| 精品亚洲二区| 日韩三级电影| 国模 一区 二区 三区| 日本人视频jizz页码69| 99久久精品国产网站| 女人裸体性做爰全过| 午夜a成v人精品| 国产精品久久久久久免费| 日韩成人在线电影网| 最新国产在线拍揄自揄视频| 日韩美女激情视频| jazzjazz国产精品久久| 一级二级三级欧美| 性一交一乱一区二区洋洋av| 男女污污视频网站| 久久精品视频在线免费观看| 久久精品久久精品久久| 欧美视频在线一区| 亚洲三级黄色片| 欧美老少配视频| 国产精品伦一区二区| 精品视频导航| 国产精品www994| 777视频在线| 久久久午夜电影| 国产一级特黄aaa大片| 91麻豆精品久久久久蜜臀| 精品三级久久久久久久电影聊斋| 久久久久久999| 国产精品麻豆| 国产美女视频免费| 视频一区中文字幕国产| 亚洲第一成人网站| 精品国产成人av| 欧美一级淫片免费视频魅影视频| 久久成年人免费电影| 亚洲精品成人一区| 亚洲精品成人自拍| 青青草国产精品亚洲专区无| 性久久久久久久久久| 午夜一区二区三区视频| 日韩在线视频免费| 国内外成人免费激情在线视频网站 | 日本黄视频在线观看| 欧美激情网友自拍| 日韩一区二区三区色| 日韩精品第1页| 国产一区二区在线观看视频| 天天色影综合网| 91精品国产综合久久福利软件 | 高潮一区二区三区乱码| 欧美理论电影在线观看| 日本精品视频| 日b视频免费观看| 99视频热这里只有精品免费| 香蕉免费毛片视频| 日韩精品黄色网| 电影一区二区三区| 国产精品女主播视频| 国产亚洲电影| www.com操| 亚洲精品美国一| 亚洲欧美激情在线观看| 久久久久久12| 精品一区亚洲| 天天爽人人爽夜夜爽| 一区精品在线播放| a天堂在线视频| 久久久亚洲国产天美传媒修理工| 欧美电影完整版在线观看| 成人午夜视频免费在线观看| 国产日韩高清在线| 国产精品探花视频| 久久久久久久97| 亚洲日本三级| 狠狠操狠狠干视频| 一区二区国产盗摄色噜噜| 天堂91在线| 欧美日韩国产第一页| 成人精品动漫一区二区三区| 亚洲色成人一区二区三区小说| 欧美激情在线免费观看| 精品国产伦一区二区三区| 98视频在线噜噜噜国产| 欧美日韩激情| 波多野结衣网页| 色综合中文综合网| 欧美成人二区| 精品高清视频| 麻豆精品久久精品色综合| 久草网视频在线观看| 亚洲欧美日韩在线高清直播| 亚洲国产aⅴ精品一区二区三区| 一卡二卡三卡视频| 国产日韩成人精品| 亚洲奶汁xxxx哺乳期| 国产精品白嫩美女在线观看| 亚洲九九视频| 中文字幕一区二区人妻在线不卡| 欧美卡1卡2卡| 成人性教育av免费网址| 91成人在线视频观看| 国产午夜精品理论片a级大结局| www五月婷婷| 国产精品久久一区| 99视频在线精品国自产拍免费观看|