synchronized


public class SynchronizedTest {
    
   public void methodA(){
      synchronized (this){

      }

   }
   public synchronized void methodB(){

   }

    public synchronized static void methodC(){

    }
}

编译后

E:\LearningProject2022\cloud-consumer-order80\src\test\java>javap -v SynchronizedTest.class
Classfile /E:/LearningProject2022/cloud-consumer-order80/src/test/java/SynchronizedTest.class
  Last modified 2022-3-18; size 465 bytes
  MD5 checksum 98ca0cd6cd90749035cbee8278a80719
  Compiled from "SynchronizedTest.java"
public class SynchronizedTest
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#17         // java/lang/Object."":()V
   #2 = Class              #18            // SynchronizedTest
   #3 = Class              #19            // java/lang/Object
   #4 = Utf8               
   #5 = Utf8               ()V
   #6 = Utf8               Code
   #7 = Utf8               LineNumberTable
   #8 = Utf8               methodA
   #9 = Utf8               StackMapTable
  #10 = Class              #18            // SynchronizedTest
  #11 = Class              #19            // java/lang/Object
  #12 = Class              #20            // java/lang/Throwable
  #13 = Utf8               methodB
  #14 = Utf8               methodC
  #15 = Utf8               SourceFile
  #16 = Utf8               SynchronizedTest.java
  #17 = NameAndType        #4:#5          // "":()V
  #18 = Utf8               SynchronizedTest
  #19 = Utf8               java/lang/Object
  #20 = Utf8               java/lang/Throwable
{
  public SynchronizedTest();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."":()V
         4: return
      LineNumberTable:
        line 1: 0

  public void methodA();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=1
         0: aload_0
         1: dup
         2: astore_1
         3: monitorenter
         4: aload_1
         5: monitorexit
         6: goto          14
         9: astore_2
        10: aload_1
        11: monitorexit
        12: aload_2
        13: athrow
        14: return
      Exception table:
         from    to  target type
             4     6     9   any
             9    12     9   any
      LineNumberTable:
        line 5: 0
        line 7: 4
        line 9: 14
      StackMapTable: number_of_entries = 2
        frame_type = 255 /* full_frame */
          offset_delta = 9
          locals = [ class SynchronizedTest, class java/lang/Object ]
          stack = [ class java/lang/Throwable ]
        frame_type = 250 /* chop */
          offset_delta = 4

  public synchronized void methodB();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_SYNCHRONIZED
    Code:
      stack=0, locals=1, args_size=1
         0: return
      LineNumberTable:
        line 12: 0

  public static synchronized void methodC();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_STATIC, ACC_SYNCHRONIZED
    Code:
      stack=0, locals=0, args_size=0
         0: return
      LineNumberTable:
        line 16: 0
}
SourceFile: "SynchronizedTest.java"

 

 去创建的对象里获取对象头的锁,非静态方法是竞争同一个对象的锁

 静态方法是基于类的,虽然是两个方法,但是对应同一个类,静态方法是对类进行上锁的。

 

 this 代表当前对象,锁的this其实是锁的当前对象,和第一个例子一个道理。