如何使用compute()将foreach方法更改为原子方式工作

xvw2m8pv  于 2021-07-12  发布在  Java
关注(0)|答案(0)|浏览(337)

有人知道我该如何将下面的操作更改为原子操作吗?这个count变量是一个hashmap<string,integer>,我需要使用compute方法(存在于map对象上)使这个代码线程安全。下面的第一个代码段是运行良好的旧代码,但它不是线程安全的。

  1. PageParser.Result result = parserFactory.get(url).parse();
  2. for (Map.Entry<String, Integer> e : result.getWordCounts().entrySet()) {
  3. if (counts.containsKey(e.getKey())) {
  4. counts.put(e.getKey(), e.getValue() + counts.get(e.getKey()));
  5. } else {
  6. counts.put(e.getKey(), e.getValue());
  7. }
  8. }

下面的代码是我尝试使用compute(原子)方法所做的,但是它不起作用。

  1. PageParser.Result result = parserFactory.get(url).parse();
  2. for (ConcurrentMap.Entry<String, Integer> e : result.getWordCounts().entrySet()) {
  3. counts.compute(e.getKey(), (k, v) -> {
  4. if (counts.containsKey(k)) {
  5. return counts.put(k, v + counts.get(k));
  6. } else {
  7. return counts.put(k, v);
  8. }
  9. });
  10. }

不要注意concurrentmap而不是map,我在第二部分中更改了它,但错误与此无关。我需要修改被注解的代码来使用计算,但是我不能让它工作。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题