`CLDRTimeZoneNameProviderImpl.getDisplayNameArray()` modifies the array
cached by `LocaleResources` when filling in missing time zone names.
As a result, names derived for a parent locale can be reused by a later
lookup for a child locale, making the result depend on lookup order.

This change copies the array before updating the zone ID and deriving
fallback names, leaving the cached array unchanged.

`TimeZoneNameOrderTest` compares a direct lookup with a lookup made after
querying the parent locale. The two runs use separate JVMs so that they
do not share cached state.

`TimeZoneNameConcurrencyTest` compares concurrent first lookups with
sequential lookups in a fresh JVM. It is included to cover the race seen
in 11u/17u/21u; it passes on mainline both before and after the fix.

Tested with jtreg sun/util, java/util/TimeZone and java/util/Locale on 
linux-x64.

---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

-------------

Commit messages:
 - 8392223: CLDR provider mutates shared cached time zone name arrays

Changes: https://git.openjdk.org/jdk/pull/32867/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=32867&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8392223
  Stats: 203 lines in 3 files changed: 202 ins; 0 del; 1 mod
  Patch: https://git.openjdk.org/jdk/pull/32867.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/32867/head:pull/32867

PR: https://git.openjdk.org/jdk/pull/32867

Reply via email to