diff --git a/src/java.base/share/classes/java/lang/reflect/Constructor.java b/src/java.base/share/classes/java/lang/reflect/Constructor.java index 4f384953e29..50695304082 100644 --- a/src/java.base/share/classes/java/lang/reflect/Constructor.java +++ b/src/java.base/share/classes/java/lang/reflect/Constructor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -73,7 +73,7 @@ public final class Constructor extends Executable { // Generics and annotations support private final transient String signature; // generic info repository; lazily initialized - private transient ConstructorRepository genericInfo; + private transient volatile ConstructorRepository genericInfo; private final byte[] annotations; private final byte[] parameterAnnotations; @@ -87,12 +87,14 @@ public final class Constructor extends Executable { // Accessor for generic info repository @Override ConstructorRepository getGenericInfo() { + var genericInfo = this.genericInfo; // lazily initialize repository if necessary if (genericInfo == null) { // create and cache generic info repository genericInfo = ConstructorRepository.make(getSignature(), getFactory()); + this.genericInfo = genericInfo; } return genericInfo; //return cached repository } diff --git a/src/java.base/share/classes/java/lang/reflect/Field.java b/src/java.base/share/classes/java/lang/reflect/Field.java index 602f72e4a35..3e9d02d5509 100644 --- a/src/java.base/share/classes/java/lang/reflect/Field.java +++ b/src/java.base/share/classes/java/lang/reflect/Field.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -77,7 +77,7 @@ class Field extends AccessibleObject implements Member { // Generics and annotations support private final transient String signature; // generic info repository; lazily initialized - private transient FieldRepository genericInfo; + private transient volatile FieldRepository genericInfo; private final byte[] annotations; // Cached field accessor created without override @Stable @@ -106,11 +106,13 @@ class Field extends AccessibleObject implements Member { // Accessor for generic info repository private FieldRepository getGenericInfo() { + var genericInfo = this.genericInfo; // lazily initialize repository if necessary if (genericInfo == null) { // create and cache generic info repository genericInfo = FieldRepository.make(getGenericSignature(), getFactory()); + this.genericInfo = genericInfo; } return genericInfo; //return cached repository } diff --git a/src/java.base/share/classes/java/lang/reflect/Method.java b/src/java.base/share/classes/java/lang/reflect/Method.java index f8e7b9fcb20..028577c229c 100644 --- a/src/java.base/share/classes/java/lang/reflect/Method.java +++ b/src/java.base/share/classes/java/lang/reflect/Method.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -82,7 +82,7 @@ public final class Method extends Executable { // Generics and annotations support private final transient String signature; // generic info repository; lazily initialized - private transient MethodRepository genericInfo; + private transient volatile MethodRepository genericInfo; private final byte[] annotations; private final byte[] parameterAnnotations; private final byte[] annotationDefault; @@ -108,11 +108,13 @@ public final class Method extends Executable { // Accessor for generic info repository @Override MethodRepository getGenericInfo() { + var genericInfo = this.genericInfo; // lazily initialize repository if necessary if (genericInfo == null) { // create and cache generic info repository genericInfo = MethodRepository.make(getGenericSignature(), getFactory()); + this.genericInfo = genericInfo; } return genericInfo; //return cached repository } diff --git a/src/java.base/share/classes/java/lang/reflect/RecordComponent.java b/src/java.base/share/classes/java/lang/reflect/RecordComponent.java index bca4705ca87..5ce7f9bf95d 100644 --- a/src/java.base/share/classes/java/lang/reflect/RecordComponent.java +++ b/src/java.base/share/classes/java/lang/reflect/RecordComponent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,7 @@ public final class RecordComponent implements AnnotatedElement { private Method accessor; private String signature; // generic info repository; lazily initialized - private transient FieldRepository genericInfo; + private transient volatile FieldRepository genericInfo; private byte[] annotations; private byte[] typeAnnotations; private RecordComponent root; @@ -127,10 +127,12 @@ public final class RecordComponent implements AnnotatedElement { // Accessor for generic info repository private FieldRepository getGenericInfo() { + var genericInfo = this.genericInfo; // lazily initialize repository if necessary if (genericInfo == null) { // create and cache generic info repository genericInfo = FieldRepository.make(getGenericSignature(), getFactory()); + this.genericInfo = genericInfo; } return genericInfo; //return cached repository }