java - 使用 concurrentHashMap 与 Hashmap

标签 java multithreading

 private static final Map<String, SampleClass> map = new
 ConcurrentHashMap<>();

 public static SampleClass getsampleclass(String context) {

     if( map.get(context) != null) {
         return map.get(context);
     } else {
         SampleClass cls = new SampleClass(context);
         map.put(context, cls);
     }
 }

在多线程环境下,如果两个线程都将map.get(context)作为null,那么两个线程都会创建cls , 并且 put 将被阻塞,因此 thread1 将首先放置,然后 thread2 将覆盖 thread1 放置的内容。
这种行为是否正确?
在我的例子中,我希望在完成 map.get 时返回相同的值,因此我看到使用 HashMapsynchronizing 它是首选。

最佳答案

使用 CHM 的原子 computeIfAbsent()方法,您不必担心同步问题:

return map.computeIfAbsent(context, SampleClass::new);

关于java - 使用 concurrentHashMap 与 Hashmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54359428/

相关文章:

c# - Interop 字进程不会立即关闭

java - JNI 线程创建

python - 有没有办法让 pandas read_csv 函数更快

c - 在 C 编程中,是否有可能从自身线程内部暂停线程并在从其他线程传递信号后恢复线程?

java - 非常大的对象集合的客户端 View 。如何优化?

java - 无法比较子类中ArrayList的大小

java - 为桌面应用程序选择语言

JAVA - 路径问题(在 Eclipse 中有效,在 cmd 中无效)

java - 如何在 Caché 中使用 Java 方法?

java - Executors.newSingleThreadExecutor() - 如何查看队列中有多少任务