Questions tagged «concurrenthashmap»

5
迭代ConcurrentHashMap值线程安全吗?
在javadoc中,ConcurrentHashMap如下: 检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠。检索反映了自发生以来最新完成的更新操作的结果。对于诸如putAll和clear的聚合操作,并发检索可能仅反映某些条目的插入或删除。同样,迭代器和枚举返回的元素反映了在创建迭代器/枚举时或此后某个时刻哈希表的状态。他们不抛出ConcurrentModificationException。但是,迭代器被设计为一次只能由一个线程使用。 这是什么意思?如果我尝试同时使用两个线程迭代地图,会发生什么情况?如果在迭代过程中从地图上放置或删除值会怎样?

7
为什么ConcurrentHashMap防止空键和值?
的JavaDoc这样ConcurrentHashMap说: 类似Hashtable但不同HashMap,这个类就不会允许null用作键或值。 我的问题:为什么? 第二个问题:为什么Hashtable不允许null? 我已经使用了很多HashMaps来存储数据。但是当更改为ConcurrentHashMapNullPointerExceptions 时,我遇到了几次麻烦。

3
gcc std :: unordered_map实现慢吗?如果是这样-为什么?
我们正在用C ++开发高性能的关键软件。在那里,我们需要一个并发的哈希映射并实现一个。因此,我们编写了一个基准来确定与并发哈希图相比要慢多少std::unordered_map。 但是,这std::unordered_map似乎太慢了……所以这是我们的微基准测试(对于并发映射,我们产生了一个新线程,以确保不会对锁定进行优化,并且请注意,我从不插入0,因为我也使用进行了基准测试google::dense_hash_map,需要一个空值): boost::random::mt19937 rng; boost::random::uniform_int_distribution<> dist(std::numeric_limits<uint64_t>::min(), std::numeric_limits<uint64_t>::max()); std::vector<uint64_t> vec(SIZE); for (int i = 0; i < SIZE; ++i) { uint64_t val = 0; while (val == 0) { val = dist(rng); } vec[i] = val; } std::unordered_map<int, long double> map; auto begin = std::chrono::high_resolution_clock::now(); for (int i = 0; …


3
递归ConcurrentHashMap.computeIfAbsent()调用永远不会终止。错误还是“功能”?
前段时间,我写了一篇关于Java 8函数式递归计算斐波纳契数的方法,其中包括ConcurrentHashMap缓存和新的有用computeIfAbsent()方法: import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class Test { static Map<Integer, Integer> cache = new ConcurrentHashMap<>(); public static void main(String[] args) { System.out.println( "f(" + 8 + ") = " + fibonacci(8)); } static int fibonacci(int i) { if (i == 0) return i; if (i == 1) return …

6
在使用ConcurrentMap的putIfAbsent之前是否应该检查地图是否包含Key
我一直在使用Java的ConcurrentMap作为可从多个线程使用的地图。putIfAbsent是一种很棒的方法,比使用标准映射操作更容易读/写。我有一些看起来像这样的代码: ConcurrentMap<String, Set<X>> map = new ConcurrentHashMap<String, Set<X>>(); // ... map.putIfAbsent(name, new HashSet<X>()); map.get(name).add(Y); 在可读性方面,这很棒,但是每次都需要创建一个新的HashSet,即使它已经在地图中了。我可以这样写: if (!map.containsKey(name)) { map.putIfAbsent(name, new HashSet<X>()); } map.get(name).add(Y); 进行此更改后,它将失去一些可读性,但无需每次都创建HashSet。在这种情况下哪个更好?我倾向于第一个,因为它更具可读性。第二个将表现更好,并且可能更正确。也许有比这两种方法更好的方法。 以这种方式使用putIfAbsent的最佳实践是什么?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.