--- old/src/java.base/share/classes/sun/reflect/generics/repository/ConstructorRepository.java 2014-11-10 17:05:35.759211810 +0100 +++ new/src/java.base/share/classes/sun/reflect/generics/repository/ConstructorRepository.java 2014-11-10 17:05:35.672213393 +0100 @@ -43,8 +43,8 @@ public class ConstructorRepository extends GenericDeclRepository { - private Type[] paramTypes; // caches the generic parameter types info - private Type[] exceptionTypes; // caches the generic exception types info + private volatile Type[] paramTypes; // caches the generic parameter types info + private volatile Type[] exceptionTypes; // caches the generic exception types info // protected, to enforce use of static factory yet allow subclassing protected ConstructorRepository(String rawSig, GenericsFactory f) { @@ -83,11 +83,12 @@ */ public Type[] getParameterTypes(){ - if (paramTypes == null) { // lazily initialize parameter types + Type[] ps = paramTypes; + if (ps == null) { // lazily initialize parameter types // first, extract parameter type subtree(s) from AST TypeSignature[] pts = getTree().getParameterTypes(); // create array to store reified subtree(s) - Type[] ps = new Type[pts.length]; + ps = new Type[pts.length]; // reify all subtrees for (int i = 0; i < pts.length; i++) { Reifier r = getReifier(); // obtain visitor @@ -97,15 +98,16 @@ } paramTypes = ps; // cache overall result } - return paramTypes.clone(); // return cached result + return ps.clone(); // return cached result } public Type[] getExceptionTypes(){ - if (exceptionTypes == null) { // lazily initialize exception types + Type[] es = exceptionTypes; + if (es == null) { // lazily initialize exception types // first, extract exception type subtree(s) from AST FieldTypeSignature[] ets = getTree().getExceptionTypes(); // create array to store reified subtree(s) - Type[] es = new Type[ets.length]; + es = new Type[ets.length]; // reify all subtrees for (int i = 0; i < ets.length; i++) { Reifier r = getReifier(); // obtain visitor @@ -115,6 +117,6 @@ } exceptionTypes = es; // cache overall result } - return exceptionTypes.clone(); // return cached result + return es.clone(); // return cached result } }