我想使用基于比较器的键值映射。这将进行读取和罕见的写入操作(通过调度程序每 3 个月一次)。集合的初始加载将在应用程序启动时完成。
另请注意,写入将:
- 将单个条目添加到地图
- 不会修改地图的任何现有条目。
ConcurrentSkipListMap 会是一个很好的候选者吗?对此的 get 操作是否允许同时访问多个线程?我正在寻找并发非阻塞读取但原子写入。
ConcurrentHashMap https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html正是您正在寻找的。来自 Javadoc:
检索操作(包括 get)通常不会阻塞,因此可能与更新操作(包括 put 和 remove)重叠。检索反映了最近完成的更新操作在其开始时的结果。 (更正式地说,给定键的更新操作与报告更新值的该键的任何(非空)检索具有发生之前关系。)
听起来它满足了您对“并发非阻塞读取但原子写入”的要求。
由于您执行的写入操作很少,因此您可能需要指定一个创建ConcurrentHashMap时的高loadFactor和适当的initialSize https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#ConcurrentHashMap-int-float-int-,这将防止在填充地图时调整表大小,尽管这充其量只是一个适度的好处。 (您还可以将 concurrencyLevel 设置为 1,尽管 Java 8 的 Javadoc 似乎暗示它不再用作大小调整提示。)
If you 绝对必须有 a SortedMap https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html or NavigableMap https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html, then ConcurrentSkipListMap https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentSkipListMap.html是开箱即用的方法。但在使用它们之前,我会仔细检查您是否确实需要这些接口提供的功能(获取第一个/最后一个键、子图、查找附近的条目等)。您将付出高昂的代价(对于大多数操作,log n 与恒定时间)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)