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其实是锁的当前对象,和第一个例子一个道理。