Index: modules/luni/src/main/java/java/io/ObjectStreamClass.java =================================================================== --- modules/luni/src/main/java/java/io/ObjectStreamClass.java (revision 646273) +++ modules/luni/src/main/java/java/io/ObjectStreamClass.java (working copy) @@ -34,6 +34,7 @@ import org.apache.harmony.luni.util.Msg; import org.apache.harmony.luni.util.PriviAction; +import org.apache.harmony.luni.util.ThreadLocalCache; /** * Instances of ObjectStreamClass are used to describe classes of objects used @@ -135,10 +136,6 @@ static final Class OBJECTSTREAMCLASSCLASS = ObjectStreamClass.class; - // Table mapping instances of java.lang.Class to to corresponding instances - // of ObjectStreamClass - private static final WeakHashMap, ObjectStreamClass> classesAndDescriptors = new WeakHashMap, ObjectStreamClass>(); - private transient Method methodWriteReplace; private transient Method methodReadResolve; @@ -928,15 +925,13 @@ */ private static ObjectStreamClass lookupStreamClass(Class cl, boolean computeSUID) { - // Synchronized because of the lookup table 'classesAndDescriptors' - ObjectStreamClass cachedValue; - synchronized (classesAndDescriptors) { - cachedValue = classesAndDescriptors.get(cl); - if (cachedValue == null) { - cachedValue = createClassDesc(cl, computeSUID); - classesAndDescriptors.put(cl, cachedValue); - } + WeakHashMap,ObjectStreamClass> tlc = OSCThreadLocalCache.oscWeakHashMap.get(); + + ObjectStreamClass cachedValue = tlc.get(cl); + if (cachedValue == null) { + cachedValue = createClassDesc(cl, computeSUID); + tlc.put(cl, cachedValue); } return cachedValue; @@ -1151,4 +1146,16 @@ return getName() + ": static final long serialVersionUID =" //$NON-NLS-1$ + getSerialVersionUID() + "L;"; //$NON-NLS-1$ } + + static class OSCThreadLocalCache extends ThreadLocalCache { + + // thread-local cache for ObjectStreamClass.lookup + public static ThreadLocalCache,ObjectStreamClass>> oscWeakHashMap = new ThreadLocalCache,ObjectStreamClass>>() { + protected WeakHashMap,ObjectStreamClass> initialValue() { + return new WeakHashMap,ObjectStreamClass>(); + } + }; + + } + }