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

Reply via email to