众所周知,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/