相关疑难解决方法(0)

LongAdder的表现如何比AtomicLong更好

我看到Java的AtomicInteger如何在内部使用CAS(比较和交换)操作.基本上,当多个线程尝试更新值时,JVM在内部使用底层CAS机制并尝试更新该值.如果更新失败,则再次尝试使用新值但从不阻止.

在Java8中,Oracle引入了一个新的类LongAdder,它在高争用下似乎比AtomicInteger表现更好.一些博客文章声称LongAdder通过维护内部单元格表现更好 - 这是否意味着LongAdder在内部聚合值并在以后更新它?你能帮我理解LongAdder的工作原理吗?

java concurrency

19
推荐指数
2
解决办法
7108
查看次数

更改哈希映射java中的值

我创建了一个哈希映射,用户输入密钥和值.如果输入特定键,我希望能够更改哈希映射的值.我尝试了setValue方法但什么都没得到.值和键都是字符串.我会用什么方法来改变它?

java hashmap key-value

8
推荐指数
1
解决办法
6万
查看次数

给定具有getOrDefault的键的更新hashmap值

我有一个HashMap:

HashMap<string, Integer> hmap = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

我想在哪里增加HashMap值.为了避免nullPointer Exception如果密钥不存在,我检查一下!假设数据是:

//201803271 - 1000
//201803271 - 1000
//201803272 - 1000

//inside a loop i read the data...
  if (hmap.get("201803271") != null) {
      hmap.put("201803271", hmap.get("201803271") + 1000);
  }else{
      hmap.put("201803271", 1000);
  }
//end of loop
Run Code Online (Sandbox Code Playgroud)

这是有效的:

201803271 - 2000
201803272 - 1000
Run Code Online (Sandbox Code Playgroud)

但是,我读了这个问题如何在java hashmap中给出一个键来更新一个值?并且有一个使用Java 8方法的解决方案getOrDefault.我尝试过这个

hmap.put("201803271", count.getOrDefault("201803271", 1000) + 1000)
Run Code Online (Sandbox Code Playgroud)

但是,有了这个解决方案我得到错误的结果......

201803271 - 3000
201803272 - 2000
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

hashmap java-8

4
推荐指数
2
解决办法
1171
查看次数

标签 统计

hashmap ×2

java ×2

concurrency ×1

java-8 ×1

key-value ×1