失败的安全迭代器:内存处罚?

时间:2015-02-25 17:43:48

标签: java multithreading iterator hashmap

所以只是通过ConcurrentHashMap,它似乎是一个带有故障安全迭代器的线程安全实现。

使用数据结构的副本创建故障安全迭代器的实现,因此可以防止引入并发修改的问题。但它增加了内存使用量的惩罚。

这个惩罚有多高?这总是等于数据结构的大小吗?

考虑到我计划在ConcurrentHashMap中保存大量上下文,如果我迭代,那么我的应用程序内存占用量会突然加倍。

此外,如果有'n'个线程同时迭代数据结构,那么内存损失是否是数据结构大小的'n'倍?

这似乎是为Fail Safe迭代器支付的代价高昂的代价。如果惩罚不在此顺序,我可以通过将故障快速迭代器与互斥锁结合使用来阻止使用故障安全迭代器吗?

1 个答案:

答案 0 :(得分:4)

不,ConcurrentHashMap的迭代器不会制作这样的副本。最糟糕的情况是它保留了对哈希表的一个段的引用比地图本身更长,但是一旦迭代器被丢弃或迭代超过该段的地图,该引用就会得到GC。迭代器本身需要O(1)内存,并且需要O(1)时间来创建。

迭代器是弱一致的,这意味着它被允许但没有义务反映自迭代器创建以来地图中的变化。