我正在编写一个使用map作为缓存存储的实用类。现在它将用于多线程环境。我想出了在执行put操作时使用同步hashmap或使用putIfAbsent的ConcurrentHashMap,但我仍然对它是否易于覆盖键值(尽管键值在我的情况下是唯一的)感到困惑,并且两者都有优点和缺点。所以我无法做出决定。可能有一些其他的缓存存储我可以用于这个目的,但建议,但我更有兴趣知道哪些将被使用CHM或哈希图如果这是唯一的选择。在这种情况下哪个更好的ConcurrentHashMap或Synchronized Hash Map?
在程序的评论是CHM的用法,我认为我也使用了HashMap。
public final class DateTime {
private static final Map<CountryLanguage, Locale> localeMap = new HashMap<>();
/*private static final Map<CountryLanguage, Locale> localeMap = new ConcurrentHashMap<>();*/
public static String getDateTime1(String pattern, LocalDateTime localDateTime, String language,
String country) {
if (language == null || language.isEmpty()) {
throw new NullPointerException("Language cannot be null or empty");
}
CountryLanguage countryLanguage = new CountryLanguage(language, country);
if (!localeMap.containsKey(countryLanguage)) {
synchronized (localeMap) {
// Putting double lock
if (!localeMap.containsKey(countryLanguage)) {
for (Locale locale : Locale.getAvailableLocales()) {
if (locale.getLanguage().equals(language) && locale.getCountry().equals(country)) {
localeMap.put(new CountryLanguage(language, country), locale);
}
}
}
}
}
/*for (Locale locale : Locale.getAvailableLocales()) {
if (locale.getLanguage().equals(language) && locale.getCountry().equals(country)) {
localeMap.putIfAbsent(new CountryLanguage(language, country), locale);
}
}*/
Locale locale = localeMap.get(countryLanguage);
if (locale == null) {
locale = Locale.ROOT;
}
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern, locale);
return localDateTime.format(dateTimeFormatter);
}
注:
- 我有一个内部类CountryLanguage其中有字符串的国家,语言的字符串作为成员变量和两者的hashCode和equals方法已被覆盖。
编辑1:我没有使整个地图作为同步我只是在放置操作时使用同步的地图。而我使用双重检查,以确保没有两个键值存在
添加同一个'CountryLanguage'两次会出现什么问题? – Marvin
@Marvin:没有问题,但Map如何包含两次相同的密钥。我认为并发hashmap可以有多个相同的键值。 –
您没有正确使用同步。如果多个线程访问共享的可变状态(映射),则必须同步** all **访问该状态,读取和写入。不只是写道。 –