更高效的多线程可能吗?
More efficient multi threading possible?
我有一个并发哈希映射,我需要在其中循环更新值。
虽然,并发映射本身是线程安全的,但添加操作不是原子的,因此我需要添加同步块。此处如有错误请指正
问题是是否可以使用锁等更有效地同步此代码?我正在从阻塞队列中获取值。
代码如下:
// running in a loop
String i = (String) queue.take();
synchronized(this) {
if(hashmap.containsKey(i)) {
hashmap.put(i, hashmap.get(i) + 1);
} else {
hashmap.put(i, 1);
}
}
您可以使用 ConcurrentHashMap.computeIfAbsent
和 AtomicInteger
值来实现您的计数器地图,而无需在整个地图上同步:
ConcurrentHashMap<String,AtomicInteger> map = new ConcurrentHashMap<>();
String key = ...
map.computeIfAbsent(key, k -> new AtomicInteger()).incrementAndGet();
我有一个并发哈希映射,我需要在其中循环更新值。 虽然,并发映射本身是线程安全的,但添加操作不是原子的,因此我需要添加同步块。此处如有错误请指正
问题是是否可以使用锁等更有效地同步此代码?我正在从阻塞队列中获取值。
代码如下:
// running in a loop
String i = (String) queue.take();
synchronized(this) {
if(hashmap.containsKey(i)) {
hashmap.put(i, hashmap.get(i) + 1);
} else {
hashmap.put(i, 1);
}
}
您可以使用 ConcurrentHashMap.computeIfAbsent
和 AtomicInteger
值来实现您的计数器地图,而无需在整个地图上同步:
ConcurrentHashMap<String,AtomicInteger> map = new ConcurrentHashMap<>();
String key = ...
map.computeIfAbsent(key, k -> new AtomicInteger()).incrementAndGet();