Skip to content

Commit ba945bc

Browse files
author
duke
committedMay 10, 2024
Automatic merge of jdk:master into master
2 parents 6ad956b + d654124 commit ba945bc

File tree

4 files changed

+56
-16
lines changed

4 files changed

+56
-16
lines changed
 

‎src/java.base/share/classes/java/util/Locale.java

+17-9
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import java.text.DateFormat;
4949
import java.text.MessageFormat;
5050
import java.util.concurrent.ConcurrentHashMap;
51+
import java.util.function.Function;
5152
import java.util.spi.LocaleNameProvider;
5253
import java.util.stream.Stream;
5354

@@ -980,29 +981,36 @@ static Locale getInstance(String language, String script, String country,
980981
return getInstance(baseloc, extensions);
981982
}
982983

984+
983985
static Locale getInstance(BaseLocale baseloc, LocaleExtensions extensions) {
984986
if (extensions == null) {
985987
Locale locale = CONSTANT_LOCALES.get(baseloc);
986988
if (locale != null) {
987989
return locale;
988990
}
989-
return LOCALE_CACHE.computeIfAbsent(baseloc, Locale::createLocale);
991+
return LOCALE_CACHE.computeIfAbsent(baseloc, LOCALE_CREATOR);
990992
} else {
991993
LocaleKey key = new LocaleKey(baseloc, extensions);
992-
return LOCALE_CACHE.computeIfAbsent(key, Locale::createLocale);
994+
return LOCALE_CACHE.computeIfAbsent(key, LOCALE_CREATOR);
993995
}
994996
}
995997

996-
private static final ReferencedKeyMap<Object, Locale> LOCALE_CACHE = ReferencedKeyMap.create(true, ConcurrentHashMap::new);
997-
private static Locale createLocale(Object key) {
998-
if (key instanceof BaseLocale base) {
999-
return new Locale(base, null);
998+
private static final ReferencedKeyMap<Object, Locale> LOCALE_CACHE
999+
= ReferencedKeyMap.create(true, ReferencedKeyMap.concurrentHashMapSupplier());
1000+
1001+
private static final Function<Object, Locale> LOCALE_CREATOR = new Function<>() {
1002+
@Override
1003+
public Locale apply(Object key) {
1004+
if (key instanceof BaseLocale base) {
1005+
return new Locale(base, null);
1006+
}
1007+
LocaleKey lk = (LocaleKey)key;
1008+
return new Locale(lk.base, lk.exts);
10001009
}
1001-
LocaleKey lk = (LocaleKey)key;
1002-
return new Locale(lk.base, lk.exts);
1003-
}
1010+
};
10041011

10051012
private static final class LocaleKey {
1013+
10061014
private final BaseLocale base;
10071015
private final LocaleExtensions exts;
10081016
private final int hash;

‎src/java.base/share/classes/jdk/internal/util/ReferencedKeyMap.java

+15
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,21 @@ public final class ReferencedKeyMap<K, V> implements Map<K, V> {
9999
*/
100100
private final ReferenceQueue<K> stale;
101101

102+
/**
103+
* @return a supplier to create a {@code ConcurrentHashMap} appropriate for use in the
104+
* create methods.
105+
* @param <K> the type of keys maintained by the new map
106+
* @param <V> the type of mapped values
107+
*/
108+
public static <K, V> Supplier<Map<ReferenceKey<K>, V>> concurrentHashMapSupplier() {
109+
return new Supplier<>() {
110+
@Override
111+
public Map<ReferenceKey<K>, V> get() {
112+
return new ConcurrentHashMap<>();
113+
}
114+
};
115+
}
116+
102117
/**
103118
* Private constructor.
104119
*

‎src/java.base/share/classes/jdk/internal/util/ReferencedKeySet.java

+9
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,15 @@ public final class ReferencedKeySet<T> extends AbstractSet<T> {
7575
*/
7676
final ReferencedKeyMap<T, ReferenceKey<T>> map;
7777

78+
/**
79+
* @return a supplier to create a {@code ConcurrentHashMap} appropriate for use in the
80+
* create methods.
81+
* @param <E> the type of elements maintained by this set
82+
*/
83+
public static <E> Supplier<Map<ReferenceKey<E>, ReferenceKey<E>>> concurrentHashMapSupplier() {
84+
return ReferencedKeyMap.concurrentHashMapSupplier();
85+
}
86+
7887
/**
7988
* Private constructor.
8089
*

‎src/java.base/share/classes/sun/util/locale/BaseLocale.java

+15-7
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
import jdk.internal.vm.annotation.Stable;
3939

4040
import java.util.StringJoiner;
41-
import java.util.concurrent.ConcurrentHashMap;
41+
import java.util.function.UnaryOperator;
4242

4343
public final class BaseLocale {
4444

@@ -93,7 +93,7 @@ public final class BaseLocale {
9393

9494
// Interned BaseLocale cache
9595
private static final ReferencedKeySet<BaseLocale> CACHE =
96-
ReferencedKeySet.create(true, ConcurrentHashMap::new);
96+
ReferencedKeySet.create(true, ReferencedKeySet.concurrentHashMapSupplier());
9797

9898
public static final String SEP = "_";
9999

@@ -164,13 +164,21 @@ public static BaseLocale getInstance(String language, String script,
164164
// "interned" instance can subsequently be used by the Locale
165165
// instance which guarantees the locale components are properly cased/interned.
166166
return CACHE.intern(new BaseLocale(language, script, region, variant),
167-
(b) -> new BaseLocale(
168-
LocaleUtils.toLowerString(b.language).intern(),
169-
LocaleUtils.toTitleString(b.script).intern(),
170-
LocaleUtils.toUpperString(b.region).intern(),
171-
b.variant.intern()));
167+
// Avoid lambdas since this may be on the bootstrap path in many locales
168+
INTERNER);
172169
}
173170

171+
public static final UnaryOperator<BaseLocale> INTERNER = new UnaryOperator<>() {
172+
@Override
173+
public BaseLocale apply(BaseLocale b) {
174+
return new BaseLocale(
175+
LocaleUtils.toLowerString(b.language).intern(),
176+
LocaleUtils.toTitleString(b.script).intern(),
177+
LocaleUtils.toUpperString(b.region).intern(),
178+
b.variant.intern());
179+
}
180+
};
181+
174182
public static String convertOldISOCodes(String language) {
175183
return switch (language) {
176184
case "he", "iw" -> OLD_ISO_CODES ? "iw" : "he";

0 commit comments

Comments
 (0)