我有一个由多个线程共享的 ConcurrentHashMap 对象:
Map<String, MyConnection> myMap = new ConcurrentHashMap<String, MyConnection>();
MyConnection 类包含一些到数据源的连接。
在稍后阶段,我需要迭代 ConcurrentHashMap,调用 MyConnection.close() 方法并将其从 Map 中删除。像这样:
for(String key : myMap.ketSet()) {
MyConnection connection = myMap.get(key);
connection.close();
myMap.remove(key);
}
但是myMap是多线程共享的,可以同时在ConcurrentHashMap中添加、删除
如何确保上面的 for 循环是线程安全的?不要求循环必须删除映射中的所有条目。循环只需要在调用 myMap.keySet() 时删除所有元素。添加到 map 的任何后续元素都不必删除。
显然我可以锁定整个 for 循环并防止其他线程接触 map ,但我认为它的性能效率不高。
有人可以分享您的意见吗?
EDIT1 :这个怎么样?这个线程安全吗?
for(MyConnection connection : myMap.values()) {
connection.close();
myMap.remove(connection.getId());
}
每个连接对象都有一个ID,它也是该条目的键。
最佳答案
正确的做法是使用remove的返回值:
for(String key : myMap.ketSet()) {
MyConnection connection = myMap.remove(key);
if (connection != null)
connection.close();
}
关于java - 安全地迭代一个被多线程访问的 ConcurrentHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26088953/