精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日日狠狠久久偷偷四色综合免费| 亚洲成人综合网站| 91免费视频国产| 久久精品国产亚洲av高清色欲| 琪琪久久久久日韩精品| 色综合天天综合网国产成人综合天| 天堂资源在线亚洲资源| 亚洲av无码一区二区三区性色| 亚洲另类黄色| 日韩中文字在线| 亚洲高清无码久久| 日韩成人一区| 欧美视频中文字幕在线| 中国 免费 av| 亚洲一级片网站| 午夜啪啪小视频| 精品欧美色视频网站在线观看| 国产一区二区久久| 日韩av高清不卡| 一区二区视频免费看| 国语产色综合| 日韩激情在线视频| 无人码人妻一区二区三区免费| 伊人久久精品一区二区三区| 亚洲女同女同女同女同女同69| 品久久久久久久久久96高清| 蜜臀av在线观看| 国产精品亚洲专一区二区三区 | 97久久人人超碰caoprom欧美| 国产精品第5页| 亚洲人人精品| 久久99精品久久久久久噜噜| 免费成人深夜夜行网站| 欧美老女人另类| 亚洲欧美国产一本综合首页| 亚洲精品成人无码毛片| 国产精品一级在线观看| 欧美美女一区二区三区| the porn av| 色综合天天色| 色拍拍在线精品视频8848| 成年人网站免费视频| 精品一性一色一乱农村| 亚洲精品亚洲人成人网在线播放| 一区二区不卡在线| a√资源在线| 国产精品盗摄一区二区三区| 亚洲精品成人自拍| av网站在线免费播放| 国产欧美中文在线| 日韩精品av一区二区三区| 欧美日本韩国一区二区| 久久精品视频免费| 欧美国产一二三区| 精华区一区二区三区| 久久嫩草精品久久久精品| 久久久久网址| 福利成人在线观看| 欧美国产综合色视频| 亚洲一区免费看| 久久精品视频观看| 亚洲欧美色综合| japanese在线播放| 免费污视频在线| 亚洲aⅴ怡春院| 成人免费毛片网| 欧美色网在线| 56国语精品自产拍在线观看| 日本黄色三级网站| 欧美毛片免费观看| 亚洲香蕉在线观看| 欧美激情精品久久久久久免费| 香蕉综合视频| 久久久久久久一区二区三区| 久久久久久91亚洲精品中文字幕| 老司机午夜精品视频在线观看| 国产精品日韩在线| 精品人妻一区二区三区换脸明星 | 美女精品自拍一二三四| 亚洲福利视频网站| 精品中文字幕人| 亚洲色图狠狠干| 久久精品欧美日韩| eeuss中文| 国产不卡人人| 在线观看国产精品网站| 欧美专区第二页| 嫩草国产精品入口| 在线看欧美日韩| 国产一级片免费看| 日韩精品三区四区| 444亚洲人体| 国产视频在线看| 一区二区三区中文字幕| 亚洲欧洲日产国码无码久久99| 69堂免费精品视频在线播放| 日韩一区二区三区在线视频| 毛片网站免费观看| 艳女tv在线观看国产一区| 亚州成人av在线| 一本大道伊人av久久综合| 成人丝袜视频网| 亚洲午夜精品一区二区| 成av人片在线观看www| 欧美日韩你懂得| 欧美黑人欧美精品刺激| 99久久久久久中文字幕一区| 欧美专区中文字幕| 性做久久久久久久久久| 国产精品少妇自拍| 99爱视频在线| 电影一区二区在线观看| 欧美大尺度在线观看| 波多野结衣高清在线| 成人国产精品视频| 五月天激情图片| 色成人综合网| 一区二区三区日韩在线| 伊人手机在线视频| 成人免费高清在线| 亚洲黄色网址在线观看| aaaa欧美| 亚洲桃花岛网站| 中文字幕精品三级久久久| 国产精品一区三区| 桥本有菜av在线| 欧美高清你懂的| 在线观看久久久久久| 中文字幕视频网站| 93久久精品日日躁夜夜躁欧美| 97av中文字幕| 国产精品亚洲四区在线观看| 最新国产成人av网站网址麻豆| 国产女同在线观看| 成人免费观看视频| 男人添女人荫蒂免费视频| 日韩精品视频中文字幕| 久久中文久久字幕| 91国偷自产中文字幕久久| 国产精品美女久久久久久2018| 欧洲熟妇精品视频| 欧美日韩国产一区二区三区不卡 | 69夜色精品国产69乱| 日本伊人精品一区二区三区观看方式 | 日韩在线观看a| 一区二区三区四区视频免费观看 | 日韩高清欧美高清| aaa人片在线| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 精品久久久久久| 国产福利在线观看视频| 一本一本久久| 久久久久免费网| 国产综合色区在线观看| 在线观看欧美日韩| 国产理论片在线观看| 成人欧美一区二区三区白人| 一级片免费在线观看视频| 欧美69wwwcom| 国产综合欧美在线看| 欧美xxxhd| 亚洲午夜久久久影院| 在线免费看av的网站| 亚洲色图丝袜美腿| av免费观看不卡| 丝袜美腿亚洲综合| 伊人久久青草| ccyy激情综合| 国产精品99久久久久久人| 欧美激情黑人| 欧美成人激情免费网| 日韩xxxxxxxxx| 欧美激情中文不卡| 麻豆精品国产传媒| 欧美一级网站| 偷拍盗摄高潮叫床对白清晰| www.久久东京| 国产成人午夜视频网址| 大片免费在线观看| 日韩av在线网页| 中文字幕乱码无码人妻系列蜜桃| 综合久久久久久久| 成人性生活免费看| 美国三级日本三级久久99| 国产精品videossex国产高清| 日韩精品导航| 成人av在线亚洲| 手机av在线| 久久精品久久久久| 午夜性色福利视频| 7799精品视频| 精品人妻无码一区二区性色| 国产精品国产三级国产普通话蜜臀| 国产精品日日摸夜夜爽| 视频一区二区中文字幕| 日本a级片在线观看| 久久99精品久久久久久园产越南| 亚洲精品日产aⅴ| 中文av在线全新| 欧美日本高清一区| 成人精品福利| 亚洲美女中文字幕| 午夜久久久久久噜噜噜噜| 在线观看精品一区| 国产污污视频在线观看| 亚洲免费av在线| 欧美激情成人在线视频| 国产激情在线观看视频| 99精品国产一区二区三区| 九色一区二区| 成人春色在线观看免费网站| 国产精品日日摸夜夜添夜夜av| 大桥未久在线视频| 久热精品在线视频| 91网页在线观看| 国产午夜精品久久久 | 亚洲国产成人精品电影| 国产精品久久久久久久一区二区| 欧美午夜丰满在线18影院| 欧美黑吊大战白妞| 亚洲欧洲日产国产综合网| 中文字幕在线1| 91网上在线视频| 91黄色免费视频| 成人性生交大片免费| 下面一进一出好爽视频| 精品亚洲国产成人av制服丝袜| 免费av网址在线| 久久国产精品久久久久久电车| 国产黄色激情视频| 欧美1区视频| 蜜桃视频一区二区在线观看| 亚洲不卡av不卡一区二区| 亚洲欧美日韩精品久久久| 国产欧美日韩免费观看 | 天天综合一区| 综合视频免费看| 999国产精品视频| 亚洲一区高清| 午夜精品久久久久久久四虎美女版| 特级西西444www大精品视频| 精品国产视频| 亚洲不卡中文字幕| 在线观看福利片| 欧美一级高清免费| wwwww黄色| 久久影院午夜片一区| av电影在线播放| 99久久精品久久久久久清纯| 日本一区二区在线免费观看| 成人精品一区二区三区四区 | 欧美一区二区性放荡片| 91久久精品国产91性色69| 91精品婷婷国产综合久久竹菊| 夜夜狠狠擅视频| 欧美一区二区成人6969| www.综合色| 亚洲精品suv精品一区二区| 日夜干在线视频| 亚洲天堂影视av| 黄色免费网站在线| 欧美国产极速在线| 麻豆免费在线| 国产精品极品美女粉嫩高清在线| 国产成人午夜性a一级毛片| 91香蕉电影院| 99精品中文字幕在线不卡 | 日韩久久久久久久久久久久久| 中文在线免费一区三区| 高清视频一区二区三区| 色狠狠久久av综合| 亚洲精品成人三区| 中文不卡在线| 波多野结衣家庭教师在线播放| 日韩激情免费| 欧美激情乱人伦| 日韩激情电影免费看| 国产99久久精品一区二区| 欧美日韩女优| 中文字幕字幕中文在线中不卡视频| 精品人妻无码一区二区三区 | 日韩午夜av| 日韩视频免费在线播放| 激情欧美一区二区| 五月开心播播网| 日韩子在线观看| 欧美日韩国产中文| a级片免费视频| 亚洲美女在线视频| 特级毛片在线| 国产精品电影观看| 亚洲超碰在线观看| 欧美精品一区二区三区在线四季| 99精品美女| 虎白女粉嫩尤物福利视频| 国产精品18久久久久久久网站| 国产xxxxxxxxx| 1000部国产精品成人观看| 欧美激情黑白配| 日韩欧美的一区| 成人动漫在线播放| 69视频在线免费观看| 日韩精品三级| 亚洲综合av一区| 丝瓜av网站精品一区二区| 欧美午夜精品一区二区| 国产精品女主播av| 成人av网站在线播放| 精品福利av导航| 国产在线1区| 国产精品欧美日韩久久| 一区二区三区视频免费观看 | 国产美女诱惑一区二区| av在线网站免费观看| 中文字幕av资源一区| 九九热精品视频在线| 亚洲а∨天堂久久精品9966 | 亚洲影院免费观看| 91久久精品无码一区二区| 国产午夜精品视频| 国产高清不卡| 久久99精品国产99久久| 国产综合网站| 无码人妻少妇色欲av一区二区| 国产精品每日更新在线播放网址| 青青草免费观看视频| 日韩精品视频免费专区在线播放| 人交獸av完整版在线观看| 91在线观看免费高清| 99久久亚洲精品| 日韩高清第一页| 中文字幕不卡在线| 亚洲图片小说视频| 日韩视频免费在线观看| 久久久久毛片| 亚洲午夜精品福利| 看电视剧不卡顿的网站| 国产破处视频在线观看| 欧美专区亚洲专区| 香蕉视频在线看| 成人伊人精品色xxxx视频| 97精品视频在线看| 亚洲第一区第二区第三区| 亚洲日本一区二区三区| 国产喷水福利在线视频| 欧美国产精品日韩| www.国产精品一区| 3d动漫一区二区三区| 99精品视频在线观看免费| 精品美女久久久久| 国产亚洲美女精品久久久| 精品福利在线| 欧洲精品视频在线| jvid福利写真一区二区三区| 久久久久久久久久久免费视频| 免费污视频在线一区| 精品不卡在线| 中文亚洲字幕| 中文字幕免费视频| 欧美日韩亚洲综合| 中中文字幕av在线| 国产中文一区二区| 视频一区中文字幕国产| 精品少妇一区二区三区密爱| 69堂国产成人免费视频| а√天堂8资源在线官网| 国产私拍一区| 日韩经典中文字幕一区| 韩国一级黄色录像| 精品久久久久久最新网址| 狼人综合视频| 娇妻高潮浓精白浆xxⅹ| 成人精品一区二区三区四区| 91精品国产高潮对白| 日韩精品免费在线观看| 视频精品导航| 韩国黄色一级大片| 成人精品gif动图一区| 国产免费av一区| 日韩中文av在线| 超碰成人在线观看| 任你操这里只有精品| 亚洲视频免费在线观看| 日韩一区二区三区不卡| 国产成一区二区| 影音先锋成人在线电影| 国产激情视频网站| 欧美日韩在线播放三区四区| 任你弄在线视频免费观看| 久久偷看各类wc女厕嘘嘘偷窃| 麻豆视频观看网址久久| 日韩黄色在线视频| 久久精品99久久香蕉国产色戒| 国语一区二区三区| 污污网站免费看| 五月激情综合网| 欧美极品另类| 日本一区二区三区在线视频| 国产一区不卡在线| 樱花视频在线免费观看|