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);
    }

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容