ConcurrentHashMap<Integer, ArrayList<Object>>线程安全吗?

Is ConcurrentHashMap<Integer, ArrayList<Object>> Thread safe?

这就是我定义 ConcurrentHashMap:

的方式
ConcurrentHashMap<Integer, ArrayList<Object>> all_payloads = new ConcurrentHashMap<Integer, ArrayList<Object>>();

我知道那里的阻塞操作只有在写入或从 ConcurrentHashMap 中删除时才有效,但是这个锁是否也会扩展到 ArrayList 类型的值?

例如:

for(int i = 0; i < all_payloads.get(0).size(); i++) {
        if(all_payloads.get(0).get(i).getBucketNumberCollector() == this.bucket_no) {
            currentPayload = all_payloads.get(0).remove(i);
            currentPayload.setCollector(collector);
            all_payloads.get(1).add(currentPayload);
            break;
        }
    }

在上面的代码片段中,我仅使用 get​(Object key) 方法修改与该键关联的值 - 在本例中为 ArrayList.

类型

上面的代码片段是线程安全的吗?如果不是,那么可以做些什么呢?

不,不是。一个 ArrayList 就是一个 ArrayList,不管你把它放在哪里。 ConcurrentHashMap 的同步仅扩展到 get 操作,从那里开始,如果多个线程可以同时执行同一段代码,则需要额外的机制来保护它。

List<Object> myList = all_payloads.get(0);
synchronized (myList) {
    // code that uses myList

即使 ArrayList 是线程安全的(它不是),您在该片段中有四个不同的 all_payloads.get 调用,即使它们单独是线程安全的,组合它们不是(在存在并发的情况下,调用可以以时髦的方式交错)。