diff --git a/src/share/classes/sun/reflect/generics/factory/CoreReflectionFactory.java b/src/share/classes/sun/reflect/generics/factory/CoreReflectionFactory.java index 71a34bb6df075b822e13073face08f145ebd9de9..fb939f415c9df148e9bd5675a0dbba25fdd612fd 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 7cedafd64e2805d4076ec683780eef81dc5589e2..0bc6f608811cca892208a33ce3cd0762a0d906fb 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 a28d88d3a1e224f2a4ffa7c37e47def7a6cfeca4..42f9446c33a8403b948b001caaf05e3cfd721801 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 f60f03346c3cad9b9b4a8e9fe131e3b04841f905..d3b54514e3816e17c4d1e5e7039b3ea5c5c68f27 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 28cb4b4c70a3bc5d9b85c738b025743cd3874db4..38af5203022da087252a1b9dfb9aa1800b6c7df2 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 bc0132eeab7a0e774bc8a1ac3d01f3198dbaab69..872360b80563cf4371946ace512480a4a996033f 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 ca77d9f8a04a43e51ee0d50ef2f9950de074ffe7..9347f977061ba453a9cd3d4672c9b29957a396a6 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,