Java 锁定ConcurrentHashMap的值对象

Java 锁定ConcurrentHashMap的值对象,java,hashmap,Java,Hashmap,在本帖中: 我问我们是否可以使用Synchronized block只锁定HashMap的条目,我知道我们不能。现在,我的问题是,如果我们有一个ConcurrentHashMap(不是hashMap),其值类型为ArrayList或TreeMap,那么我可以使用这种方法(使用synchronized)。我的意思是: ConcurrentHashMap<String, ArrayList<String>> map = new ConcurrentHashMap&l

在本帖中:

我问我们是否可以使用Synchronized block只锁定HashMap的条目,我知道我们不能。现在,我的问题是,如果我们有一个ConcurrentHashMap(不是hashMap),其值类型为ArrayList或TreeMap,那么我可以使用这种方法(使用synchronized)。我的意思是:

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




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

    }
ConcurrentHashMap=新的ConcurrentHashMap();
已同步(map.get(“key”)){
//安全地使用阵列线程执行某些操作,
}

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

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

安全吗?除非我们知道你可能会对这些价值观做什么,否则我们不负责。代码的另一部分是否单独使用它们?在访问它们之前,它们是否锁定了相应的监视器?你是对的。我的意思是,如果我想访问arraylist时使用同步块,那么它是线程安全的吗?为什么我需要putIfAbsent?假设您调用
map.put(“key”,new Object())由多个线程同时执行。每个线程都可以成功,这样您就可以在多个对象上同步。如果您改为使用
putIfAbsent(“key”,new Object())
则只有一个线程会成功,并且您将在该单个对象上进行同步。