From 5f7803f2dbc82794cf35533292033fa0d7f7d808 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 28 Jul 2021 21:09:48 +0200 Subject: [PATCH] Use double-checked locking in some reflection internals Note that `volatile` is not needed because in both cases we initialize an object with a final field, which is subject to safe initialization. --- .../descriptors/runtime/structure/ReflectJavaMember.kt | 9 +++------ .../src/kotlin/reflect/full/KAnnotatedElements.kt | 6 ++---- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/structure/ReflectJavaMember.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/structure/ReflectJavaMember.kt index 03a5b03cc08..2322239c704 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/structure/ReflectJavaMember.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/structure/ReflectJavaMember.kt @@ -24,7 +24,6 @@ import java.lang.reflect.AnnotatedElement import java.lang.reflect.Member import java.lang.reflect.Method import java.lang.reflect.Type -import java.util.* abstract class ReflectJavaMember : ReflectJavaElement(), ReflectJavaAnnotationOwner, ReflectJavaModifierListOwner, JavaMember { abstract val member: Member @@ -53,7 +52,7 @@ abstract class ReflectJavaMember : ReflectJavaElement(), ReflectJavaAnnotationOw for (i in parameterTypes.indices) { val type = ReflectJavaType.create(parameterTypes[i]) val name = names?.run { - getOrNull(i + shift) ?: error("No parameter with index $i+$shift (name=$name type=$type) in $this@ReflectJavaMember") + getOrNull(i + shift) ?: error("No parameter with index $i+$shift (name=$name type=$type) in ${this@ReflectJavaMember}") } val isParamVararg = isVararg && i == parameterTypes.lastIndex result.add(ReflectJavaValueParameter(type, parameterAnnotations[i], name, isParamVararg)) @@ -89,10 +88,8 @@ private object Java8ParameterNamesLoader { } fun loadParameterNames(member: Member): List? { - var cache = cache - if (cache == null) { - cache = buildCache(member) - this.cache = cache + val cache = cache ?: synchronized(this) { + cache ?: buildCache(member).also { cache = it } } val getParameters = cache.getParameters ?: return null diff --git a/core/reflection.jvm/src/kotlin/reflect/full/KAnnotatedElements.kt b/core/reflection.jvm/src/kotlin/reflect/full/KAnnotatedElements.kt index cb42abb4842..38107bcbe1e 100644 --- a/core/reflection.jvm/src/kotlin/reflect/full/KAnnotatedElements.kt +++ b/core/reflection.jvm/src/kotlin/reflect/full/KAnnotatedElements.kt @@ -86,10 +86,8 @@ private object Java8RepeatableContainerLoader { } fun loadRepeatableContainer(klass: Class): Class? { - var cache = cache - if (cache == null) { - cache = buildCache() - this.cache = cache + val cache = cache ?: synchronized(this) { + cache ?: buildCache().also { cache = it } } val repeatableClass = cache.repeatableClass ?: return null