Java 是ConcurrentHashMap<;整数,ArrayList<;对象>&燃气轮机;线程安全?

Java 是ConcurrentHashMap<;整数,ArrayList<;对象>&燃气轮机;线程安全?,java,arraylist,java.util.concurrent,Java,Arraylist,Java.util.concurrent,我就是这样定义ConcurrentHashMap的: ConcurrentHashMap<Integer, ArrayList<Object>> all_payloads = new ConcurrentHashMap<Integer, ArrayList<Object>>(); 在上面的代码片段中,我只使用了get​(对象键)修改与该键关联的值的方法-在本例中,该键的类型为ArrayList 上面的代码段是线程安全的吗?如果没有,那怎么办才能做

我就是这样定义ConcurrentHashMap的:

ConcurrentHashMap<Integer, ArrayList<Object>> all_payloads = new ConcurrentHashMap<Integer, ArrayList<Object>>();
在上面的代码片段中,我只使用了
get​(对象键)
修改与该键关联的值的方法-在本例中,该键的类型为
ArrayList


上面的代码段是线程安全的吗?如果没有,那怎么办才能做到呢?

不,没有。
ArrayList
是一个
ArrayList
,无论您将其放置在何处。
ConcurrentHashMap
的同步只扩展到
get
操作,从那以后,如果多个线程可以同时执行同一段代码,则需要额外的机制来保护它

List myList=所有有效载荷。获取(0);
已同步(myList){
//使用myList的代码

即使
ArrayList
是线程安全的(事实并非如此),您也有四个不同的
所有有效负载。在该代码段中获取
调用,即使这些调用是单独的线程安全的,它们的组合也不是(在存在并发的情况下,调用可以以奇怪的方式交错).

那么,按照你的建议,这行吗?除了
0
1
之外,还有其他条目吗?如果没有,两个独立的变量可能比将它们填充到一个映射中更有意义。@Thilo是的,我只是输入
0
1
来隐藏一些不相关的逻辑来计算密钥。
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;
        }
    }