【发布时间】:2016-12-15 22:06:57
【问题描述】:
我想使用基于比较器的键值映射。这将具有读取和罕见的写入操作(每 3 个月通过调度程序执行一次)。集合的初始加载将在应用程序启动时完成。 另请注意,写入将:
- 向地图添加单个条目
- 不会修改地图的任何现有条目。
ConcurrentSkipListMap 将是一个很好的候选者。对此的get操作是否允许同时访问多个线程?我正在寻找并发非阻塞读取但原子写入。
【问题讨论】:
-
我会非常怀疑您希望连续运行三个月的应用程序,但老实说,任何 ConcurrentMap 实现都可以在这里工作。
-
除非加载的成本非常,否则我会使用不可变地图并每 3 个月创建一个新地图。无需担心线程安全。
-
是的,对于所有并发集合,它的操作都是线程安全的。从javadoc中也很清楚。如果你只对 get() 感兴趣,我想知道你为什么不简单地使用 ConcurrentHashMap,它是 O(1) 而不是 O(log(n))。
-
我认为我没有足够的数据来假设我比 OP 更了解他们的情况。
-
老实说,我只是使用对非同步映射的 volatile 引用,并偶尔将其替换为包含新数据的副本。我真的不明白为什么我们在集合中是否有原始对象或复杂对象会很重要——这似乎与给定问题无关。如果我们有一个或一万个读者,最佳解决方案的性能应该是相同的独立的。
标签: java multithreading java.util.concurrent concurrentskiplistmap