java - 理解 concurrentHashMap

标签 java multithreading dictionary

众所周知,ConcurrenthashMap类允许我们安全地使用迭代器。据我从 Map 的来源了解到,它是通过将当前 Map 状态存储到迭代器本身来实现的。这是代表迭代器的内部类(有一个子项是在 iterator() 被调用时创建的):

abstract class HashIterator {
        int nextSegmentIndex;
        int nextTableIndex;
        HashEntry<K,V>[] currentTable;
        HashEntry<K, V> nextEntry;
        HashEntry<K, V> lastReturned;

        //Methods and ctor
}

但是,如果某个线程在构造迭代器期间向 Map 写入了一些东西怎么办?那么我们会得到 map 的非确定性状态吗?

问题是 Map 的两个方法都不是同步的。 put 方法有一个ReentrantLock,但仅此而已(据我所知)。所以,我不明白迭代器如何支持正确的状态,即使某些线程在其构造期间写入 map ?。

最佳答案

迭代器提供弱一致性状态。它不提供数据的交易 View 。它只提供如果未更改,您将看到所有键/值,如果更改,您可能会或可能不会看到该更改,但您不会收到错误。

关于java - 理解 concurrentHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32328425/

相关文章:

java - java.io.FileNotFoundException:HIVE_PLAN没有这样的文件或目录

java - JMagick:程序意外终止并返回-1073740940

php - 如何在 PHP 应用程序中使用多线程

python - 如何迭代字典的所有可能值?

python - 按关键字长度对字典进行排序

所有词典中的 Python 打印键

java - 如何保证重写方法的线程安全?

java - 如何在 Eclipse 中的类而不是一行上设置断点?

c++ - 在 C++ 中创建线程与两个独立的程序?

python - 我的Python多线程代码是否受到全局解释器锁的影响