故障安全迭代器:内存惩罚?
Fail Safe Iterators: Memory Penalties?
所以刚刚经历了 ConcurrentHashMap,它似乎是一个带有故障安全迭代器的线程安全实现。
故障安全迭代器的实现是使用数据结构的副本创建的,因此这可以防止引入并发修改的问题。但它会增加内存使用量。
这个惩罚有多高?这是否总是等于数据结构的大小?
考虑到我计划在 ConcurrentHashMap 中保存大量上下文,如果我进行迭代,我的应用程序内存占用突然翻倍确实是有害的。
此外,如果有 'n' 个线程同时迭代数据结构,那么内存损失是数据结构大小的 'n' 倍吗?
这似乎是为故障安全迭代器付出的昂贵代价。如果惩罚不符合这个顺序,我可以通过将快速失败迭代器与互斥体组合来阻止使用失败安全迭代器吗?
不,ConcurrentHashMap
的迭代器不会像这样制作任何副本。最坏的情况是,它保留对散列段 table 的引用比映射本身长,但一旦迭代器被丢弃或迭代超过映射的该段,该引用将立即被 GC地图。迭代器本身需要 O(1) 的内存和 O(1) 的创建时间。
迭代器弱一致,这意味着允许但没有义务反映自创建迭代器以来映射中的更改。
所以刚刚经历了 ConcurrentHashMap,它似乎是一个带有故障安全迭代器的线程安全实现。
故障安全迭代器的实现是使用数据结构的副本创建的,因此这可以防止引入并发修改的问题。但它会增加内存使用量。
这个惩罚有多高?这是否总是等于数据结构的大小?
考虑到我计划在 ConcurrentHashMap 中保存大量上下文,如果我进行迭代,我的应用程序内存占用突然翻倍确实是有害的。
此外,如果有 'n' 个线程同时迭代数据结构,那么内存损失是数据结构大小的 'n' 倍吗?
这似乎是为故障安全迭代器付出的昂贵代价。如果惩罚不符合这个顺序,我可以通过将快速失败迭代器与互斥体组合来阻止使用失败安全迭代器吗?
不,ConcurrentHashMap
的迭代器不会像这样制作任何副本。最坏的情况是,它保留对散列段 table 的引用比映射本身长,但一旦迭代器被丢弃或迭代超过映射的该段,该引用将立即被 GC地图。迭代器本身需要 O(1) 的内存和 O(1) 的创建时间。
迭代器弱一致,这意味着允许但没有义务反映自创建迭代器以来映射中的更改。