當前位置:網站首頁>synchronized是如何實現的
synchronized是如何實現的
2022-07-23 08:18:36【LLAiden】
synchronized是很多小夥伴都使用過的代碼同不關鍵字,接下來我們看一下synchronized在字節碼層面是如何實現的
先上代碼
public class Main {
public static void main(String[] args) throws InterruptedException {}
public void m() {
Object object = new Object();
synchronized (object) {
}
}
}這個代碼其實沒有任務邏輯,就是有個m方法,並且在方法中有個空的synchronized代碼塊
下面我們使用idea中的工具看一下字節碼 view->show Bytecode
public m()V
TRYCATCHBLOCK L0 L1 L2 null
TRYCATCHBLOCK L2 L3 L2 null
L4
LINENUMBER 12 L4
NEW java/lang/Object
DUP
INVOKESPECIAL java/lang/Object.<init> ()V
ASTORE 1
L5
LINENUMBER 13 L5
ALOAD 1
DUP
ASTORE 2
MONITORENTER
L0
LINENUMBER 14 L0
ALOAD 2
MONITOREXIT
L1
GOTO L6
L2
FRAME FULL [org/example/Main java/lang/Object java/lang/Object] [java/lang/Throwable]
ASTORE 3
ALOAD 2
MONITOREXIT
L3
ALOAD 3
ATHROW
L6
LINENUMBER 15 L6
FRAME CHOP 1
RETURN
L7
LOCALVARIABLE this Lorg/example/Main; L4 L7 0
LOCALVARIABLE object Ljava/lang/Object; L5 L7 1
MAXSTACK = 2
MAXLOCALS = 4
我們重點關注一下下面一段代碼
MONITORENTER
L0
LINENUMBER 13 L0
ALOAD 1
MONITOREXIT這裏這就是synchronized在字節碼層面的實現接下來我們看下去除synchronized塊後的字節碼
public m()V
L0
LINENUMBER 12 L0
NEW java/lang/Object
DUP
INVOKESPECIAL java/lang/Object.<init> ()V
ASTORE 1
L1
LINENUMBER 13 L1
RETURN
L2
LOCALVARIABLE this Lorg/example/Main; L0 L2 0
LOCALVARIABLE object Ljava/lang/Object; L1 L2 1
MAXSTACK = 2
MAXLOCALS = 2從前後兩份字節碼可以明顯看出MONITORENTER 和 MONITOREXIT被去除了,從這裏我們可以知道了synchronized在字節碼層面的實現
synchronized同步代碼塊中就在字節碼層面上實現如下
MONITORENTER
...
我們的同步代碼塊
...
MONITOREXIT版權聲明
本文為[LLAiden]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/204/202207222239474316.html
邊欄推薦
猜你喜歡
隨機推薦
- TypeScript
- 開源工具 SAP UI5 Tools 介紹
- Lark教程指南
- 網絡安全——使用Evil Maid物理訪問安全漏洞進行滲透
- 網絡安全—使用Ubuntu本地提權漏洞進行滲透及加固
- JWT工具類編寫
- Day1 Running Sum of 1d Array/Find Pivot Index/用兩個棧實現隊列
- socket編程之常用api介紹與socket、select、poll、epoll高並發服務器模型代碼實現
- 深入研究容器隊列
- Bean的初始化回調方法和釋放資源的回調方法
- 爬蟲數據保存到mysql數據庫
- 通過SQL進行數據分發
- Redis 分布式鎖如何自動續期(經典解决方案)
- 虹科動態 | cippe2022即將舉辦,報名火熱進行中
- Kotlin之匿名內部類(object: xxxx)
- 面試突擊:truncate、delete和drop的6大區別
- Ubuntu安裝Docker及Docker的基本命令 安裝MySQL
- LeetCode--棧和隊列篇
- etcd 集群部署
- TCP/IP協議族中需要必知必會的十大問題
- 【STM32學習】(21)STM32實現步進電機
- 繪制帶有查詢條件變量的table【grafana】
- 認識接口
- LABVIEW:創建一個VI
- 界面開發框架DevExtreme Gantt控件——可導出PDF、排序任務
- MySQL命令行導出導入數據庫和數據錶
- 有數大數據基礎平臺之智能運維平臺EasyEagle介紹:集群隊列篇
- 你記住JS中offsetWidth、clientWidth、width、scrollWidth、clientX、screenX、offsetX、pageX嗎?
- 【Azure 事件中心】Azure Event Hub 新功能嘗試 -- 异地灾難恢複 (Geo-Disaster Recovery)
- unity 照片牆
- 影響持續交付的因素有哪些?
- 【快速上手教程7】瘋殼·開源編隊無人機-地面站上比特機的使用和介紹
- Redis配置詳解
- docker安裝MySQL、redis
- 【嵌入式】限幅電路和鉗比特電路 利用二極管的單向導電性
- [知識圖譜]cql與py2neo學習筆記
- C語言學習
- 列轉行與數據集連接在業務場景的組合應用
- MySQL5.6/ 5.7 SSL配置
- 【深度學習】損失函數(平均絕對誤差,均方誤差,平滑損失,交叉熵,帶權值的交叉熵,骰子損失,FocalLoss)