Tag: concurrenthashmap

Java中的ConcurrentHashMap?

在java中使用并发哈希映射是什么? 它有什么好处? 它是如何工作的? 请帮助…示例代码也是有用的..

什么时候应该使用ConcurrentSkipListMap?

在Java中, ConcurrentHashMap有更好的multithreading解决scheme。 那么我应该什么时候使用ConcurrentSkipListMap ? 这是冗余吗? 这两者之间的multithreading方面是否共同?

recursionConcurrentHashMap.computeIfAbsent()调用永不终止。 错误或“function”?

前些时候, 我已经写了一个Java 8函数recursion计算 computeIfAbsent() 数字的方法 ,用一个ConcurrentHashMapcaching和新的有用的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 1; […]

在使用ConcurrentMap的putIfAbsent之前,你应该检查map是否包含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); 可读性明智,但它确实需要每次创build一个新的HashSet,即使它已经在地图中。 我可以写这个: if (!map.containsKey(name)) { map.putIfAbsent(name, new HashSet<X>()); } map.get(name).add(Y); 有了这个改变,它会失去一些可读性,但不需要每次都创buildHashSet。 在这种情况下哪个更好? 我倾向于第一个方面,因为它更可读。 第二个performance会更好,可能会更正确。 也许有比这两个更好的方法来做到这一点。 以这种方式使用putIfAbsent的最佳做法是什么?

gcc std :: unordered_map实现缓慢吗? 如果是这样 – 为什么?

我们正在用C ++开发一个高性能的关键软件。 在那里我们需要一个并发哈希映射并实现一个。 所以我们写了一个基准来计算出我们的并发哈希映射与std::unordered_map相比要慢多less。 但是, std::unordered_map似乎是非常慢…所以这是我们的微基准(对于并发映射,我们产生了一个新的线程,以确保locking不会被优化,注意我从来没有inser 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; […]

迭代ConcurrentHashMap值线程安全吗?

在javadoc中用于ConcurrentHashMap的是: 检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠。 检索反映了最近完成的更新操作的结果。 对于像putAll和clear这样的集合操作,并发检索可能反映只插入或删除一些条目。 类似地,迭代器和枚举在创build迭代器/枚举时或之后返回反映哈希表状态的元素。 他们不会抛出ConcurrentModificationException。 但是,迭代器一次只能被一个线程使用。 这是什么意思? 如果我尝试用两个线程同时迭代地图会发生什么? 如果我在迭代时从地图上放置或删除一个值,会发生什么?

为什么ConcurrentHashMap防止空键和值?

ConcurrentHashMap的JavaDoc说: 像Hashtable一样,但不像HashMap ,这个类不允许null被用作键或值。 我的问题:为什么? 第二个问题:为什么不Hashtable允许null? 我用了很多HashMaps来存储数据。 但是当更改为ConcurrentHashMap时,由于NullPointerExceptions,我有几次陷入麻烦。