--- old/src/java.base/share/classes/java/text/DateFormatSymbols.java 2016-02-23 17:56:10.485856700 +0530 +++ new/src/java.base/share/classes/java/text/DateFormatSymbols.java 2016-02-23 17:56:09.737051900 +0530 @@ -606,7 +606,7 @@ try { DateFormatSymbols other = (DateFormatSymbols)super.clone(); - copyMembers(this, other); + copyMembers(new SymbolsCacheEntry(locale), other); return other; } catch (CloneNotSupportedException e) { throw new InternalError(e); @@ -669,7 +669,7 @@ /** * Cache to hold DateFormatSymbols instances per Locale. */ - private static final ConcurrentMap> cachedInstances + private static final ConcurrentMap> cachedInstances = new ConcurrentHashMap<>(3); private transient int lastZoneIndex; @@ -683,10 +683,10 @@ locale = desiredLocale; // Copy values of a cached instance if any. - SoftReference ref = cachedInstances.get(locale); - DateFormatSymbols dfs; - if (ref != null && (dfs = ref.get()) != null) { - copyMembers(dfs, this); + SoftReference ref = cachedInstances.get(locale); + SymbolsCacheEntry sce; + if (ref != null && (sce = ref.get()) != null) { + copyMembers(sce, this); return; } @@ -717,11 +717,11 @@ weekdays = toOneBasedArray(resource.getStringArray("DayNames")); shortWeekdays = toOneBasedArray(resource.getStringArray("DayAbbreviations")); - // Put a clone in the cache - ref = new SoftReference<>((DateFormatSymbols)this.clone()); - SoftReference x = cachedInstances.putIfAbsent(locale, ref); + sce = new SymbolsCacheEntry(locale); + ref = new SoftReference<>(sce); + SoftReference x = cachedInstances.putIfAbsent(locale, ref); if (x != null) { - DateFormatSymbols y = x.get(); + SymbolsCacheEntry y = x.get(); if (y == null) { // Replace the empty SoftReference with ref. cachedInstances.put(locale, ref); @@ -812,7 +812,7 @@ * @param src the source DateFormatSymbols. * @param dst the target DateFormatSymbols. */ - private void copyMembers(DateFormatSymbols src, DateFormatSymbols dst) + private void copyMembers(SymbolsCacheEntry src, DateFormatSymbols dst) { dst.eras = Arrays.copyOf(src.eras, src.eras.length); dst.months = Arrays.copyOf(src.months, src.months.length); @@ -821,7 +821,7 @@ dst.shortWeekdays = Arrays.copyOf(src.shortWeekdays, src.shortWeekdays.length); dst.ampms = Arrays.copyOf(src.ampms, src.ampms.length); if (src.zoneStrings != null) { - dst.zoneStrings = src.getZoneStringsImpl(true); + dst.zoneStrings = getZoneStringsImpl(true); } else { dst.zoneStrings = null; } @@ -842,4 +842,43 @@ } stream.defaultWriteObject(); } + + private static class SymbolsCacheEntry { + + final String eras[]; + final String months[]; + final String shortMonths[]; + final String weekdays[]; + final String shortWeekdays[]; + final String ampms[]; + final String zoneStrings[][]; + final String localPatternChars; + + SymbolsCacheEntry(Locale locale) { + // Initialize the fields from the ResourceBundle for locale. + LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(DateFormatSymbolsProvider.class, locale); + // Avoid any potential recursions + if (!(adapter instanceof ResourceBundleBasedAdapter)) { + adapter = LocaleProviderAdapter.getResourceBundleBased(); + } + ResourceBundle resource = ((ResourceBundleBasedAdapter) adapter).getLocaleData().getDateFormatData(locale); + if (resource.containsKey("Eras")) { + this.eras = resource.getStringArray("Eras"); + } else if (resource.containsKey("long.Eras")) { + this.eras = resource.getStringArray("long.Eras"); + } else if (resource.containsKey("short.Eras")) { + this.eras = resource.getStringArray("short.Eras"); + } else { + this.eras = null; + } + this.months = resource.getStringArray("MonthNames"); + this.shortMonths = resource.getStringArray("MonthAbbreviations"); + this.weekdays = toOneBasedArray(resource.getStringArray("DayNames")); + this.shortWeekdays = toOneBasedArray(resource.getStringArray("DayAbbreviations")); + this.ampms = resource.getStringArray("AmPmMarkers"); + this.zoneStrings = TimeZoneNameUtility.getZoneStrings(locale); + this.localPatternChars = resource.getString("DateTimePatternChars"); + + } + } }