當前位置:網站首頁>synchronized是如何實現的

synchronized是如何實現的

2022-07-23 08:18:36LLAiden

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

隨機推薦