--- old/src/java.base/share/classes/sun/reflect/generics/repository/GenericDeclRepository.java 2014-11-10 17:05:36.093205735 +0100 +++ new/src/java.base/share/classes/sun/reflect/generics/repository/GenericDeclRepository.java 2014-11-10 17:05:35.972207936 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2014, 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 @@ -42,7 +42,7 @@ 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,11 +65,12 @@ * @return the formal type parameters of this generic declaration */ public TypeVariable[] getTypeParameters(){ - if (typeParams == null) { // lazily initialize type parameters + TypeVariable[] tps = typeParams; + if (tps == null) { // lazily initialize type parameters // first, extract type parameter subtree(s) from AST FormalTypeParameter[] ftps = getTree().getFormalTypeParameters(); // create array to store reified subtree(s) - TypeVariable[] tps = new TypeVariable[ftps.length]; + tps = new TypeVariable[ftps.length]; // reify all subtrees for (int i = 0; i < ftps.length; i++) { Reifier r = getReifier(); // obtain visitor @@ -79,6 +80,6 @@ } typeParams = tps; // cache overall result } - return typeParams.clone(); // return cached result + return tps.clone(); // return cached result } }