RFR: 8286849: Use @Stable for generic repositories
ExE Boss
duke at openjdk.org
Fri Jun 17 04:02:57 UTC 2022
On Tue, 17 May 2022 04:40:50 GMT, liach <duke at 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
More information about the core-libs-dev
mailing list