43得票7回答
ConcurrentHashMap:如何避免“putIfAbsent”方法中的额外对象创建?

我正在多线程环境下为键聚合多个值。这些键事先是未知的。我认为我可以这样做:class Aggregator { protected ConcurrentHashMap<String, List<String>> entries = ...

42得票6回答
在ConcurrentHashMap中原子地递增计数器

我希望从Web应用程序的不同位置收集一些指标。为了简单起见,所有这些都将是计数器,因此唯一的修改操作是将它们增加1。 这些增加操作将是并发的且频繁的。读取(转储统计信息)是一项罕见的操作。 我想使用ConcurrentHashMap,但问题是如何正确地递增计数器。由于map没有"increme...

33得票8回答
ConcurrentHashMap.get()方法是否保证能够看到不同线程之前的ConcurrentHashMap.put()操作?

在不同的线程中,ConcurrentHashMap.get() 是否保证能够看到前一个 ConcurrentHashMap.put() 操作? 我的期望是可以,在阅读JavaDocs后似乎也是这样,但我有99%的信心现实情况与此不同。 在我的生产服务器上,下面的示例似乎正在发生(我用日志记录下...

31得票2回答
ConcurrentHashMap 读写锁

我正在尝试寻找答案,但在谷歌或Java文档中都找不到。 情况1: 在ConcurrentHashMap中,假设线程t1正在从段n读取,并且同时另一个线程t2想要在相同的段n上写入: 问题1: 这两个操作是一个接一个执行,还是它们会同时执行? 情况2: 在ConcurrentHashMa...

29得票4回答
自Java 9起,当尝试缓存递归函数结果时,HashMap.computeIfAbsent()会抛出ConcurrentModificationException异常。

今天我从一些JS课程中学到了记忆化是什么,并尝试在Java中实现它。我有一个简单的递归函数来计算第n个斐波那契数:long fib(long n) { if (n < 2) { return n; } return fib(n - 1) + fi...

29得票1回答
本地变量同步

我注意到ConcurrentHashMap的compute和computeIfAbsent方法中存在奇怪的结构:Node<K,V> r = new ReservationNode<K,V>(); synchronized (r) { //... } 考虑到JIT很可...

28得票3回答
需要简单解释“锁分离”在ConcurrentHashMap中的工作原理。

根据《Java并发实践》第11.4.3章的说法: 锁分割有时可以扩展到对独立对象的变量大小集进行分区锁定,这种情况被称为锁条纹。例如,ConcurrentHashMap的实现使用16个锁的数组,每个锁守卫散列桶的1/16;桶N由锁 N mod 16保护。 我仍然难以理解和想象锁条纹和桶机制...

27得票3回答
ConcurrentHashMap JDK 8何时使用computeIfPresent

JDK 8中Concurrent HashMap的新版本有两个新方法: - computeIfAbsent - computeIfPresent - putIfAbsent - 旧方法 我理解putIfAbsent和computeIfAbsent的用例,但不确定何时使用computeIfP...

26得票2回答
ConcurrentHashMap中entrySet().removeIf的行为

我想使用ConcurrentHashMap让一个线程定期从映射中删除一些项,而其他线程同时放置和获取映射中的项。 在删除线程中,我使用 `map.entrySet().removeIf(lambda)`。我想知道它的行为假设是什么。我可以看到`removeIf`方法使用迭代器遍历Map中的元...

24得票4回答
ConcurrentHashMap构造函数的参数是什么?

我想了解构建ConcurrentHashMap的参数: initialCapacity默认为16(已了解)。 loadFactor默认为0.75。 concurrencyLevel默认为16。 我的问题是: 如何确定调整loadFactor上下限的标准? 如何确定同时更新线程的数量...