美文网首页
kotlin下的synchronized

kotlin下的synchronized

作者: 我看Android | 来源:发表于2021-07-09 11:25 被阅读0次

    关于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

          本文链接:https://www.haomeiwen.com/subject/lkqfpltx.html