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
调用,即使它们单独是线程安全的,组合它们不是(在存在并发的情况下,调用可以以时髦的方式交错)。
这就是我定义 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
调用,即使它们单独是线程安全的,组合它们不是(在存在并发的情况下,调用可以以时髦的方式交错)。