【问题标题】:Fail Safe Iterators: Memory Penalties?故障安全迭代器:内存惩罚?
【发布时间】:2015-04-27 20:36:02
【问题描述】:

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

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

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

考虑到我计划在 ConcurrentHashMap 中保存大量上下文,如果我进行迭代,我的应用程序内存占用量突然翻倍确实是有害的。

另外,如果有“n”个线程同时迭代数据结构,内存损失是数据结构大小的“n”倍吗?

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

【问题讨论】:

  • 在我看来,如果您觉得需要在哈希映射上进行迭代,您的数据结构设计就会从根本上失败。
  • @ZanLynx,为什么?想要关联并希望能够迭代关联是完全合理的,并且迭代 HashMaps 并没有那么昂贵。

标签: java multithreading iterator hashmap


【解决方案1】:

不,ConcurrentHashMap 的迭代器不会制作任何这样的副本。最坏的情况是它保留对哈希表段的引用比映射本身更长,但是一旦迭代器被丢弃或迭代经过映射的该段,该引用就会被 GC'd。迭代器本身需要 O(1) 内存和 O(1) 时间来创建。

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

【讨论】:

  • 太棒了,这让我担心了一分钟。是否有任何文档可以让我了解弱一致性迭代器究竟需要什么以及它不能保证什么?
  • 这个? docs.oracle.com/javase/7/docs/api/java/util/concurrent/… “视图的迭代器是一个“弱一致”的迭代器,它永远不会抛出 ConcurrentModificationException,并保证在构造迭代器时遍历元素,并且可能(但不保证)反映构造后的任何修改。 "
  • 感谢这是一个很大的帮助:)
  • 如果没有数据结构的副本,弱一致性迭代器如何工作?
  • 删除/添加不会破坏迭代器吗?或者如果它总是以线程安全的方式指向数据结构,为什么它会“弱”一致
猜你喜欢
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 2016-11-15
  • 1970-01-01
相关资源
最近更新 更多