根据我的理解,我认为:
我对么?
现在,如果我是正确的,我有以下问题:HashMap内部使用对象的哈希码.因此,如果两个对象可以具有相同的哈希码,那么它如何HashMap使用它所使用的键?
有人可以解释HashMap内部如何使用对象的哈希码吗?
现在没有在java 8的Javadoc推出了一个新的API computeIfAbsent 它的ConcurrentHashMap的impelementation状态:
如果指定的键尚未与值关联,则尝试使用给定的映射函数计算其值,并将其输入此映射,除非为null.整个方法调用是以原子方式执行的,因此每个键最多应用一次该函数.其他线程在此映射上的某些尝试更新操作可能在计算进行时被阻止,因此计算应该简短,并且不得尝试更新此映射的任何其他映射.
那么,在密钥已经存在且计算不需要的情况下,它对锁定此实现有什么看法呢?即使不需要计算,只是映射函数调用是同步的,以防止调用函数两次,整个方法computeIfAbsent是否如文档中所述同步?
想象一下,有两个线程A,B将分别在地图中放置两个不同的值,即v1和v2,具有相同的密钥.密钥最初不存在于映射中线程A调用containsKey并发现密钥不存在,但是立即挂起线程B调用containsKey并发现密钥不存在,并且有时间插入其值v2
当线程A回来时,会发生什么?我假设,它调用put方法反过来调用putIfAbsent但是密钥已经存在于线程B.so线程A将不会覆盖该值
但是从这个链接我发现线程A恢复并插入v1,"和平"覆盖(因为put是线程安全的)线程B插入的值 是ConcurrentHashMap完全安全吗?
我正在编写一个使用 map 作为缓存存储的实用程序类。现在因为它将在多线程环境中使用。我想出了在执行 put 操作或 ConcurrentHashMap(使用 putIfAbsent)时使用同步哈希映射的用法,我仍然对它是否容易覆盖键值感到困惑(尽管键值在我的情况下是唯一的)并且两者都有利弊。所以我无法决定。可能还有其他一些缓存存储,我可以用于此目的,建议但我更想知道如果这是唯一的选择,将使用 CHM 或 Hashmap。
在程序的评论中是 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) {
// …Run Code Online (Sandbox Code Playgroud)