From c99e16ecff041bcbe5d423fef6566920101a2751 Mon Sep 17 00:00:00 2001 From: martin Date: Thu, 13 Nov 2014 14:48:18 +0100 Subject: [PATCH] 8064391: More thread safety problems in core reflection Summary: Make fields final or volatile to ensure thread safety Reviewed-by: jfranck --- .../generics/factory/CoreReflectionFactory.java | 4 ++-- .../LazyReflectiveObjectGenerator.java | 2 +- .../generics/repository/AbstractRepository.java | 4 ++-- .../reflect/generics/repository/ClassRepository.java | 8 ++++++-- .../generics/repository/GenericDeclRepository.java | 4 +++- .../sun/reflect/generics/scope/AbstractScope.java | 10 +++++++--- .../sun/reflect/generics/tree/ClassSignature.java | 6 +++--- 7 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/share/classes/sun/reflect/generics/factory/CoreReflectionFactory.java b/src/share/classes/sun/reflect/generics/factory/CoreReflectionFactory.java index 71a34bb6d..fb939f415 100644 --- a/src/share/classes/sun/reflect/generics/factory/CoreReflectionFactory.java +++ b/src/share/classes/sun/reflect/generics/factory/CoreReflectionFactory.java @@ -45,8 +45,8 @@ import sun.reflect.generics.tree.FieldTypeSignature; * core reflection (java.lang.reflect). */ public class CoreReflectionFactory implements GenericsFactory { - private GenericDeclaration decl; - private Scope scope; + private final GenericDeclaration decl; + private final Scope scope; private CoreReflectionFactory(GenericDeclaration d, Scope s) { decl = d; diff --git a/src/share/classes/sun/reflect/generics/reflectiveObjects/LazyReflectiveObjectGenerator.java b/src/share/classes/sun/reflect/generics/reflectiveObjects/LazyReflectiveObjectGenerator.java index 7cedafd64..0bc6f6088 100644 --- a/src/share/classes/sun/reflect/generics/reflectiveObjects/LazyReflectiveObjectGenerator.java +++ b/src/share/classes/sun/reflect/generics/reflectiveObjects/LazyReflectiveObjectGenerator.java @@ -40,7 +40,7 @@ import sun.reflect.generics.visitor.Reifier; * */ public abstract class LazyReflectiveObjectGenerator { - private GenericsFactory factory; // cached factory + private final GenericsFactory factory; // cached factory protected LazyReflectiveObjectGenerator(GenericsFactory f) { factory = f; diff --git a/src/share/classes/sun/reflect/generics/repository/AbstractRepository.java b/src/share/classes/sun/reflect/generics/repository/AbstractRepository.java index a28d88d3a..42f9446c3 100644 --- a/src/share/classes/sun/reflect/generics/repository/AbstractRepository.java +++ b/src/share/classes/sun/reflect/generics/repository/AbstractRepository.java @@ -40,9 +40,9 @@ public abstract class AbstractRepository { // A factory used to produce reflective objects. Provided when the //repository is created. Will vary across implementations. - private GenericsFactory factory; + private final GenericsFactory factory; - private T tree; // the AST for the generic type info + private final T tree; // the AST for the generic type info //accessors private GenericsFactory getFactory() { return factory;} diff --git a/src/share/classes/sun/reflect/generics/repository/ClassRepository.java b/src/share/classes/sun/reflect/generics/repository/ClassRepository.java index f60f03346..d3b54514e 100644 --- a/src/share/classes/sun/reflect/generics/repository/ClassRepository.java +++ b/src/share/classes/sun/reflect/generics/repository/ClassRepository.java @@ -42,8 +42,8 @@ public class ClassRepository extends GenericDeclRepository { public static final ClassRepository NONE = ClassRepository.make("Ljava/lang/Object;", null); - private Type superclass; // caches the generic superclass info - private Type[] superInterfaces; // caches the generic superinterface info + private volatile Type superclass; // caches the generic superclass info + private volatile Type[] superInterfaces; // caches the generic superinterface info // private, to enforce use of static factory private ClassRepository(String rawSig, GenericsFactory f) { @@ -80,17 +80,20 @@ public class ClassRepository extends GenericDeclRepository { */ public Type getSuperclass(){ + Type superclass = this.superclass; if (superclass == null) { // lazily initialize superclass Reifier r = getReifier(); // obtain visitor // Extract superclass subtree from AST and reify getTree().getSuperclass().accept(r); // extract result from visitor and cache it superclass = r.getResult(); + this.superclass = superclass; } return superclass; // return cached result } public Type[] getSuperInterfaces(){ + Type[] superInterfaces = this.superInterfaces; if (superInterfaces == null) { // lazily initialize super interfaces // first, extract super interface subtree(s) from AST TypeTree[] ts = getTree().getSuperInterfaces(); @@ -104,6 +107,7 @@ public class ClassRepository extends GenericDeclRepository { sis[i] = r.getResult(); } superInterfaces = sis; // cache overall result + this.superInterfaces = superInterfaces; } return superInterfaces.clone(); // return cached result } diff --git a/src/share/classes/sun/reflect/generics/repository/GenericDeclRepository.java b/src/share/classes/sun/reflect/generics/repository/GenericDeclRepository.java index 28cb4b4c7..38af52030 100644 --- a/src/share/classes/sun/reflect/generics/repository/GenericDeclRepository.java +++ b/src/share/classes/sun/reflect/generics/repository/GenericDeclRepository.java @@ -42,7 +42,7 @@ import sun.reflect.generics.visitor.Reifier; public abstract class GenericDeclRepository extends AbstractRepository { - private TypeVariable[] typeParams; // caches the formal type parameters + private volatile TypeVariable[] typeParams; // caches the formal type parameters protected GenericDeclRepository(String rawSig, GenericsFactory f) { super(rawSig, f); @@ -65,6 +65,7 @@ public abstract class GenericDeclRepository * @return the formal type parameters of this generic declaration */ public TypeVariable[] getTypeParameters(){ + TypeVariable[] typeParams = this.typeParams; if (typeParams == null) { // lazily initialize type parameters // first, extract type parameter subtree(s) from AST FormalTypeParameter[] ftps = getTree().getFormalTypeParameters(); @@ -78,6 +79,7 @@ public abstract class GenericDeclRepository tps[i] = (TypeVariable) r.getResult(); } typeParams = tps; // cache overall result + this.typeParams = typeParams; } return typeParams.clone(); // return cached result } diff --git a/src/share/classes/sun/reflect/generics/scope/AbstractScope.java b/src/share/classes/sun/reflect/generics/scope/AbstractScope.java index bc0132eea..872360b80 100644 --- a/src/share/classes/sun/reflect/generics/scope/AbstractScope.java +++ b/src/share/classes/sun/reflect/generics/scope/AbstractScope.java @@ -41,8 +41,8 @@ import java.lang.reflect.TypeVariable; public abstract class AbstractScope implements Scope { - private D recvr; // the declaration whose scope this instance represents - private Scope enclosingScope; // the enclosing scope of this scope + private final D recvr; // the declaration whose scope this instance represents + private volatile Scope enclosingScope; // the enclosing scope of this scope /** * Constructor. Takes a reflective object whose scope the newly @@ -71,7 +71,11 @@ public abstract class AbstractScope * @return the enclosing scope */ protected Scope getEnclosingScope(){ - if (enclosingScope == null) {enclosingScope = computeEnclosingScope();} + Scope enclosingScope = this.enclosingScope; + if (enclosingScope == null) { + enclosingScope = computeEnclosingScope(); + this.enclosingScope = enclosingScope; + } return enclosingScope; } diff --git a/src/share/classes/sun/reflect/generics/tree/ClassSignature.java b/src/share/classes/sun/reflect/generics/tree/ClassSignature.java index ca77d9f8a..9347f9770 100644 --- a/src/share/classes/sun/reflect/generics/tree/ClassSignature.java +++ b/src/share/classes/sun/reflect/generics/tree/ClassSignature.java @@ -28,9 +28,9 @@ package sun.reflect.generics.tree; import sun.reflect.generics.visitor.Visitor; public class ClassSignature implements Signature { - private FormalTypeParameter[] formalTypeParams; - private ClassTypeSignature superclass; - private ClassTypeSignature[] superInterfaces; + private final FormalTypeParameter[] formalTypeParams; + private final ClassTypeSignature superclass; + private final ClassTypeSignature[] superInterfaces; private ClassSignature(FormalTypeParameter[] ftps, ClassTypeSignature sc, -- GitLab