On Tue, 17 May 2022 04:40:50 GMT, liach <d...@openjdk.org> wrote: > Generic repositories, the implementation detail for generic information in > core reflection, can be updated to use the `@Stable` annotation to replace > their `volatile` access. Their existing accessor code is already safe, > reading the cache fields only once. > > In addition, fixed potentially non-thread-safe `genericInfo` access in > `Method`, `Field`, and `RecordComponent`.
Most JDK code places the `@Stable` annotation between field modifiers and the field type. -------------------------------------------------------------------------------- Also note that `@Stable` on array fields also makes the array read‑only after initialisation: https://urldefense.com/v3/__https://github.com/openjdk/jdk/blob/9d4b25e7888098a866ff980e37b8d16d456906d8/src/java.base/share/classes/jdk/internal/vm/annotation/Stable.java*L51-L56__;Iw!!ACWV5N9M2RV99hQ!MNPwqM3U_iWsPhWZbo8JzBfg-QiS8vF6UVPJcEANMX2L-1EtqdMntILJ1Ys8hvKEjNUFp7r4MVbwAYP5xu15$ src/java.base/share/classes/java/lang/Class.java line 3297: > 3295: // Generic info repository; lazily initialized > 3296: @Stable > 3297: private transient ClassRepository genericInfo; Suggestion: private transient @Stable ClassRepository genericInfo; src/java.base/share/classes/java/lang/reflect/Constructor.java line 77: > 75: // generic info repository; lazily initialized > 76: @Stable > 77: private transient ConstructorRepository genericInfo; Suggestion: private transient @Stable ConstructorRepository genericInfo; src/java.base/share/classes/java/lang/reflect/Field.java line 80: > 78: // generic info repository; lazily initialized > 79: @Stable > 80: private transient FieldRepository genericInfo; Suggestion: private transient @Stable FieldRepository genericInfo; src/java.base/share/classes/java/lang/reflect/Method.java line 86: > 84: // generic info repository; lazily initialized > 85: @Stable > 86: private transient MethodRepository genericInfo; Suggestion: private transient @Stable MethodRepository genericInfo; src/java.base/share/classes/java/lang/reflect/RecordComponent.java line 59: > 57: // generic info repository; lazily initialized > 58: @Stable > 59: private transient FieldRepository genericInfo; Suggestion: private transient @Stable FieldRepository genericInfo; src/java.base/share/classes/sun/reflect/generics/repository/ClassRepository.java line 48: > 46: /** The generic superclass info. Lazily initialized. */ > 47: @Stable > 48: private Type superclass; Suggestion: private @Stable Type superclass; src/java.base/share/classes/sun/reflect/generics/repository/ClassRepository.java line 52: > 50: /** The generic superinterface info. Lazily initialized. */ > 51: @Stable > 52: private Type[] superInterfaces; Suggestion: private @Stable Type[] superInterfaces; src/java.base/share/classes/sun/reflect/generics/repository/ConstructorRepository.java line 49: > 47: /** The generic parameter types. Lazily initialized. */ > 48: @Stable > 49: private Type[] parameterTypes; Suggestion: private @Stable Type[] parameterTypes; src/java.base/share/classes/sun/reflect/generics/repository/ConstructorRepository.java line 53: > 51: /** The generic exception types. Lazily initialized. */ > 52: @Stable > 53: private Type[] exceptionTypes; Suggestion: private @Stable Type[] exceptionTypes; src/java.base/share/classes/sun/reflect/generics/repository/FieldRepository.java line 47: > 45: /** The generic type info. Lazily initialized. */ > 46: @Stable > 47: private Type genericType; Suggestion: private @Stable Type genericType; src/java.base/share/classes/sun/reflect/generics/repository/GenericDeclRepository.java line 50: > 48: /** The formal type parameters. Lazily initialized. */ > 49: @Stable > 50: private TypeVariable<?>[] typeParameters; Suggestion: private @Stable TypeVariable<?>[] typeParameters; src/java.base/share/classes/sun/reflect/generics/repository/MethodRepository.java line 45: > 43: /** The generic return type info. Lazily initialized. */ > 44: @Stable > 45: private Type returnType; Suggestion: private @Stable Type returnType; src/java.base/share/classes/sun/reflect/generics/scope/AbstractScope.java line 48: > 46: /** The enclosing scope of this scope. Lazily initialized. */ > 47: @Stable > 48: private Scope enclosingScope; Suggestion: private @Stable Scope enclosingScope; ------------- PR: https://git.openjdk.org/jdk/pull/8742