Java 是ConcurrentHashMap<;整数,ArrayList<;对象>&燃气轮机;线程安全?
我就是这样定义ConcurrentHashMap的: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<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;
}
}