- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我从不同的来源阅读了一些关于 ConcurrentHashmap
的陈述,并想验证它们是否确实如此。
ConcurrentHashmap
的迭代器创建后,只有线程的删除和更新操作才能保证得到反射(reflect)。编辑/删除后迭代器是否刷新其快照?为什么迭代器对待更新/删除的方式与 ADD 完全不同。
ConcurrentHashmap
将其数据分成多个段以减少写入器锁争用。 concurrencyLevel
参数直接指定类内部创建的分片数。如果我们简单地使用无参数构造函数,并接受默认配置, map 将在您添加第一个值之前实例化 16 个分片所需的对象……这里的分片是什么意思?它是 map 中的一桶数据 - 还是整个 map 的副本。我理解这个类似于数据库中的一个页面,可以独立锁定fur update。为什么 concurrencyLevel
会影响内存?
最佳答案
Does the iterator refresh its snapshot after an edit/remove?Why would the iterator treat an update/remove any differently than an ADD.
CHM 的迭代器在 API 中这样解释
Similarly, Iterators and Enumerations return elements reflecting the state of the hash table at some point at or since the creation of the iterator/enumeration.
意味着返回的 Iterator 可能反射(reflect)也可能不反射(reflect)迭代时 Map 中发生的更改。想象一下,如果您创建迭代器并遍历整个段并转到下一个段。转到下一段后,您完成遍历的第一段已完成添加或删除。好吧,你不会看到那个,没关系,它没有违反 API。
关于你的第二个问题。添加是隐含的,添加和删除之间的可见性没有区别。
Why would the concurrencylevel impact memory then?
自 ConcurrentHashMap 发布以来,内存一直是一个问题。默认情况下,每个并发级别都会创建一个单独的 Segment。该段有一个 HashEntry 表,也是一个可重入锁(因此也是所有必需品)。
Java 8 发布 CHMv8这实际上解决了这个问题。
你可以阅读更多关于内存的信息here ,具体来说:
Whilst doing a memory profile, JVisualVM showed that the top culprit was the ConcurrentHashMap.Segment class. The default number of segments per ConcurrentHashMap is 16. The HashEntry tables within the segments would probably be tiny, but each Segment is a ReentrantLock. Each ReentrantLock contains a Sync, in this case a NonFairSync, which is a subclass of Sync and then AbstractQueuedSynchronizer. Each of these contains a queue of nodes that maintain state of what is happening with your threads. It is used when fairness is determined. This queue and the nodes use a lot of memory.
关于java - 关于并发 HashMap 的事实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15885625/
我正在尝试使用以下命令通过 ansible 收集服务器 list : ansible all -m setup -a --tree facts/ 但这会在facts文件夹下为每个主机生成很多操作系统单
我决定学习 prolog 只是为了好玩,我正在看一些视频教程。我也在互联网上搜索了一些问题试图解决,但找不到解决方法。 我能够在纸上解决这个难题,但无法将其传递到代码中。 问题: I have 8 c
我正在通过DRT(规则模板)读取Excel表,然后通过Java类中的静态方法将其转换为类的对象。并将其插入到工作内存中。这样,工作内存就会被 Excel 表格中的所有事实填满。 现在,我通过 sess
我确信这非常简单,但我显然没有用谷歌搜索正确的东西。在几个单元测试相关的博客中,我看到了几个方法被赋予的属性 [fact] ,但我似乎无法弄清楚这意味着什么。示例: public class Some
我想知道这些术语之间的区别: 事实 仿函数 谓词。 规则 在Prolog中。 如果我写:brother(john, jack).这是事实吗?或谓词? 最佳答案 从 ISO/IEC 13211-1 Fi
问题 为什么选择 Ansible 事实,例如 ansible_distribution在角色部分不可用? --- - name: Test hosts: all tasks: - na
puppet 事实看起来像这样: processors => {"models"=>["AMD Opteron(tm) Processor 6172", "AMD Opteron(tm) Proces
在做了一些研究之后,我对 Prolog 以非常简单的方式表达查询的能力感到惊讶,几乎就像口头告诉机器该做什么一样。发生这种情况是因为我对工作中的 Propel 和 PHP 感到非常厌烦。 所以,我一直
我想生成一个密码和其他一些不存在的值。 像这样的东西: - name: Retrieve or generate my_password generated_fact: shell: so
我需要从 SEC 10-K 文件中获取一些事实,例如毛收入、毛利润、毛利率、营业费用等以及相应的上下文。 对于像 https://www.sec.gov/Archives/edgar/data/131
我是 puppet 新手,并计划在我们的环境中实现它。 我有在不同版本的 Redhat 上运行的 puppet 代理。 现在,我计划从 puppet master 推送存储库文件,我需要您的指导来实现
我是 puppet 新手,并计划在我们的环境中实现它。 我有在不同版本的 Redhat 上运行的 puppet 代理。 现在,我计划从 puppet master 推送存储库文件,我需要您的指导来实现
是否可以使用通常包含在 ansible_facts 中的内容?在 Ansible 临时命令中? 例如,我有一个位于 /tmp/myFile 的文件。在我所有的服务器上,我想做: ansible all
获得正确的术语是成功传达概念的一部分,当在 SO 中使用错误的术语时,带有 Prolog 标签的受访者会很好地指出错误。 在阅读 William F. Clocksin 于 1997 年 ( Worl
上下文:我的系统包含来自不同存储 Controller 的磁盘组合,因此每种类型的磁盘都有不同的用途。我是 ansible 的新手,我一边学习一边学习。编写一个剧本,从每种类型的 Controller
我是数据仓库的新手,我希望有一个关于构建星型模式的简单问题: 如果我有一个事实表,其中事实记录自然与单个维度具有一对多关系,那么如何建模星型模式来支持这一点?例如: 事实表:销售点条目(衡量标准是美元
我正在用 Idris 编写一个基本的 monadic 解析器,以适应与 Haskell 的语法和差异。我有基本的工作,但我坚持尝试为解析器创建 VerifiedSemigroup 和 Verified
我的应用程序需要足够的准确性,但 Google Places 按类别过滤的准确性似乎很差。所以我正在考虑迁移到 Factual API。大家用过吗?您如何看待它的准确性? 另一方面,我需要知道到某个地
我是一名优秀的程序员,十分优秀!