关于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);
}
到这二者区别就很明朗了
代码块①是不能起到同步锁作用的,因为每次调用它都会生成一个新的对象
如果觉得本篇文章对你有用,就顺手点个赞吧
网友评论