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

Java程序員必會Synchronized底層原理剖析

開發 前端
ynchronized是Java提供一種隱式鎖,無需開發者手動加鎖釋放鎖。保證多線程并發情況下數據的安全性,實現了同一個時刻只有一個線程能訪問資源,其他線程只能阻塞等待,簡單說就是互斥同步。

synchronized作為Java程序員最常用同步工具,很多人卻對它的用法和實現原理一知半解,以至于還有不少人認為synchronized是重量級鎖,性能較差,盡量少用。

但不可否認的是synchronized依然是并發首選工具,連volatile、CAS、ReentrantLock都無法動搖synchronized的地位。synchronized是工作面試中的必備技能,今天就跟著一燈一塊深入剖析synchronized的底層原理。

1. synchronized作用

synchronized是Java提供一種隱式鎖,無需開發者手動加鎖釋放鎖。保證多線程并發情況下數據的安全性,實現了同一個時刻只有一個線程能訪問資源,其他線程只能阻塞等待,簡單說就是互斥同步。

2. synchronized用法

先看一下synchronized有哪幾種用法?

使用位置

被鎖對象

示例代碼

實例方法

??實例對象??


public synchronized void method() {

   ……

}

靜態方法

??class類??

public static synchronized void method() {

   ……

}

實例對象

??實例對象??

public void method() {

   Object obj = new Object();

   synchronized (obj) {

       ……

   }

}

類對象

??class類??

public void method() {

   synchronized (Demo.class) {

       ……

   }

}

this關鍵字

??實例對象??

public void method() {

   synchronized (this) {

       ……

   }

}

可以看到被鎖對象只要有兩種,實例對象和class類。

  • 由于靜態方法可以通過類名直接訪問,所以它跟直接加鎖在class類上是一樣的。
  • 當在實例方法、實例對象、this關鍵字上面加鎖的時候,鎖定范圍都是當前實例對象。
  • 實例對象上面的鎖和class類上面的鎖,兩者不互斥。

3. synchronized加鎖原理

當我們使用synchronized在方法和對象上加鎖的時候,Java底層到底怎么實現加鎖的?

當在類對象上加鎖的時候,也就是在class類加鎖,代碼如下:

/**
* @author 一燈架構
* @apiNote Synchronized示例
**/
public class SynchronizedDemo {

public void method(){
synchronized (SynchronizedDemo.class) {
System.out.println("Hello world!");
}
}

}

反編譯一下,看一下源碼實現:

圖片

可以看到,底層是通過monitorenter和monitorexit兩個關鍵字實現的加鎖與釋放鎖,執行同步代碼之前使用monitorenter加鎖,執行完同步代碼使用monitorexit釋放鎖,拋出異常的時候也是用monitorexit釋放鎖。

寫成偽代碼,類似下面這樣:

/**
* @author 一燈架構
* @apiNote Synchronized示例
**/
public class SynchronizedDemo {

public void method(){
try {
monitorenter 加鎖;
System.out.println("Hello world!");
monitorexit 釋放鎖;
} catch (Exception e) {
monitorexit 釋放鎖;
}
}

}

當在實例方法上加鎖,底層是怎么實現的呢?代碼如下:

/**
* @author 一燈架構
* @apiNote Synchronized示例
**/
public class SynchronizedDemo {

public static synchronized void method(){
System.out.println("Hello world!");
}

}

再反編譯看一下底層實現:

圖片

這次只使用了一個ACC_SYNCHRONIZED關鍵字,實現了隱式的加鎖與釋放鎖。其實無論是ACC_SYNCHRONIZED關鍵字,還是monitorenter和monitorexit,底層都是通過獲取monitor鎖來實現的加鎖與釋放鎖。

而monitor鎖又是通過ObjectMonitor來實現的,虛擬機中ObjectMonitor數據結構如下(C++實現的):

ObjectMonitor() {
_header = NULL;
_count = 0; // WaitSet 和 EntryList 的節點數之和
_waiters = 0,
_recursions = 0; // 重入次數
_object = NULL;
_owner = NULL; // 持有鎖的線程
_WaitSet = NULL; // 處于wait狀態的線程,會被加入到_WaitSet
_WaitSetLock = 0 ;
_Responsible = NULL ;
_succ = NULL ;
_cxq = NULL ; // 多個線程爭搶鎖,會先存入這個單向鏈表
FreeNext = NULL ;
_EntryList = NULL ; // 處于等待鎖block狀態的線程,會被加入到該列表
_SpinFreq = 0 ;
_SpinClock = 0 ;
OwnerIsThread = 0 ;
}

圖片

圖上展示了ObjectMonitor的基本工作機制:

當多個線程同時訪問一段同步代碼時,首先會進入 _EntryList 隊列中等待。

當某個線程獲取到對象的Monitor鎖后進入臨界區域,并把Monitor中的 _owner 變量設置為當前線程,同時Monitor中的計數器 _count 加1。即獲得對象鎖。

若持有Monitor的線程調用 wait() 方法,將釋放當前持有的Monitor鎖,_owner變量恢復為null,_count減1,同時該線程進入 _WaitSet 集合中等待被喚醒。

在_WaitSet 集合中的線程會被再次放到_EntryList 隊列中,重新競爭獲取鎖。

若當前線程執行完畢也將釋放Monitor并復位變量的值,以便其他線程進入獲取鎖。

線程爭搶鎖的過程要比上面展示得更加復雜。除了_EntryList 這個雙向鏈表用來保存競爭的線程,ObjectMonitor中還有另外一個單向鏈表 _cxq,由兩個隊列來共同管理并發的線程。

圖片

責任編輯:武曉燕 來源: 一燈架構
相關推薦

2022-03-17 10:24:28

JavaJVM

2019-01-30 14:14:16

LinuxUNIX操作系統

2018-08-06 10:25:07

Linux命令程序員

2022-12-26 09:27:48

Java底層monitor

2023-09-12 11:25:15

2021-01-08 08:34:09

Synchronize線程開發技術

2021-11-02 09:54:51

Java開發工具

2023-06-09 14:01:00

架構程序APP

2020-05-13 11:20:57

MySQL規范數據庫

2024-03-15 15:12:27

關鍵字底層代碼

2009-06-15 10:43:45

Java程序員Java程序GC

2021-07-20 10:26:53

源碼底層ArrayList

2023-10-19 15:11:48

Redis

2012-11-08 09:49:30

C++Java程序員

2014-02-09 10:30:17

Python程序員工具

2023-05-11 08:01:08

Code開發保護機制

2012-03-06 09:22:46

程序員

2013-08-20 09:33:59

程序員

2019-05-27 08:11:13

高并發Synchronize底層

2024-08-28 08:00:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91久久国产综合久久 | 日韩久久久久久久久久久 | 欧美a区| 国产亚洲成av人在线观看导航 | 中文字幕在线观看成人 | 在线中文字幕亚洲 | 一区二区三区四区免费观看 | 日韩精品极品视频在线观看免费 | 男人天堂色| 国产精品久久久久无码av | 91新视频 | 欧美操操操 | 国产伦精品一区二区三区精品视频 | 亚洲欧洲一区 | 亚洲欧美日韩电影 | 欧美日高清视频 | 91免费在线播放 | 国内精品久久久久久 | 国产精品一区二区av | 青青久草 | 欧洲国产精品视频 | 69xxx免费| 在线色网站 | 91精品国产91久久久久久密臀 | 免费午夜电影 | 亚洲精品欧美 | av福利网站| 久久久精品网 | 91精品国产91久久久久久 | 精品乱码一区二区三四区 | 亚洲一区二区三区欧美 | 国产成人免费视频网站视频社区 | 欧美一级免费黄色片 | 国产一区不卡 | 国内精品视频一区二区三区 | 特一级毛片 | 国产一区久久精品 | 国产欧美精品一区二区 | 亚洲人成在线观看 | 丁香一区二区 | 91久久综合|