java - 安全地迭代一个被多线程访问的 ConcurrentHashMap

标签 java multithreading

我有一个由多个线程共享的 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/

相关文章:

java - Dropbox 身份验证

multithreading - 多线程BIOS

c++ - VC++ 11 中的 std::thread 类导致随机崩溃。任何解决方法?

ios - 为什么我们不正常地使类的每个属性都是线程安全的呢?

ruby - Sinatra with thin, multi thread 不工作

java - 比较字符串似乎无法正常工作

java - Jaxb:如何解码 xs:任何 XML 字符串部分?

java - 可以使用相同的计时器使用 2 个时间表

java - Map(带操作)Stream java 8、nestedList

C# 使用 AutoResetEvent 等待来自另一个线程的输入