【问题标题】:Locking value objects of a ConcurrentHashMap锁定 ConcurrentHashMap 的值对象
【发布时间】:2016-07-20 16:10:32
【问题描述】:

在这篇文章中: Can we use Synchronized for each entry instead of ConcurrentHashMap?

我问我们是否可以使用同步块来仅锁定 HashMap 的条目,我了解到我们不能。现在,我的问题是,如果我们有一个具有 ArrayList 或 TreeMap 类型值的 ConcurrentHashMap(不是 hashMap),那么我可以使用这种方法(使用同步)。我的意思是:

    ConcurrentHashMap<String, ArrayList<String>> map = new ConcurrentHashMap<>();




    synchronized (map.get("key")) {
        //do something with the array thread-safely, 

    }

安全吗?我问的原因是我不知道如何通过测试来检查这类问题。

【问题讨论】:

  • 安全吗? 除非我们知道您可能会对这些值做什么,否则我们无法回答。您的代码的另一部分是否单独使用它们?他们在访问它们之前是否锁定了相应的监视器?
  • 你是对的。我的意思是它是线程安全的,如果我想访问 arraylist 时使用同步块?

标签: java hashmap


【解决方案1】:

只要你使用putIfAbsent 操作,那么它就是线程安全的。您将始终在同一个对象引用上同步(阻塞)。

【讨论】:

  • 为什么需要 putIfAbsent?
  • 假设您同时由多个线程调用map.put("key", new Object());。每个线程都可以成功,这样您就可以在多个对象上进行同步。如果您改为我们putIfAbsent("key", new Object()),则只有一个线程会成功,您将在该单个对象上同步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多