kotlin下的synchronized

关于kotlin大家应该都很熟悉了,至少都是听说过了
那么在kotlin下的同步锁也就是synchronized 大家都了解吗
且看下方代码有何区别,功能是否一致

  fun test(){ 
     synchronized(AA::class){//①

        }
     synchronized(AA::class.java){//②

         }
}

①与② 有何区别,通过AS我们去查看一下其字节码

代码块①字节码如下

    LINENUMBER 17 L8
    LDC Lcom/zqc/structure/AA;.class
    INVOKESTATIC kotlin/jvm/internal/Reflection.getOrCreateKotlinClass (Ljava/lang/Class;)Lkotlin/reflect/KClass;
    
    ASTORE 1
   L9
    ICONST_0
    ISTORE 2
   L10
    ICONST_0
    ISTORE 3
   L11
    ALOAD 1
    MONITORENTER
   L0
    NOP
   L12
   L13
    ICONST_0
    ISTORE 4
   L14

代码块②字节码如下

    LINENUMBER 20 L19
    LDC Lcom/zqc/structure/AA;.class
    
    ASTORE 1
   L20
    ICONST_0
    ISTORE 2
   L21
    ICONST_0
    ISTORE 3
   L22
    ALOAD 1
    MONITORENTER
   L4
    NOP
   L23
   L24
    ICONST_0
    ISTORE 4
   L25

对比发现①比②多出了 INVOKESTATIC kotlin/jvm/internal/Reflection.getOrCreateKotlinClass (Ljava/lang/Class;)Lkotlin/reflect/KClass;
有什么作用呢,找到getOrCreateKotlinClass 方法看一下

Reflection.java 

    public static KClass getOrCreateKotlinClass(Class javaClass) {
       //调用ReflectionFactory 的getOrCreateKotlinClass方法
        return factory.getOrCreateKotlinClass(javaClass);
    }

ReflectionFactory ,java

    public KClass getOrCreateKotlinClass(Class javaClass) { 
       //创建一个新的class对象
        return new ClassReference(javaClass);
    }

到这二者区别就很明朗了
代码块①是不能起到同步锁作用的,因为每次调用它都会生成一个新的对象

如果觉得本篇文章对你有用,就顺手点个赞吧

你可能感兴趣的:(kotlin下的synchronized)