首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在并行流中插入hashmap值时的线程安全性

在并行流中插入hashmap值时的线程安全性
EN

Stack Overflow用户
提问于 2018-04-10 06:43:20
回答 1查看 1.2K关注 0票数 3

我需要在10秒的超时时间内进行异步调用,并且需要对映射中的每个元素执行此操作。异步调用的结果存储在另一个映射中。在这种情况下使用HashMap安全吗?还是需要使用ConcurrentMap

代码语言:javascript
运行
复制
Map<String, String> x = ArrayListMultimap.create();
Map<String, Boolean> value = Maps.newHashMap();

x.keySet().paralleStream().forEach(req -> {
   try {
      Response response = getResponseForRequest(req);
      value.put(req, response.getTitle());
   } catch(TimeoutException e) {
      value.put(req, null);
   }
}

这个线安全吗?我搞不懂。我知道另一种方法是创建并发hashmap,并考虑一些其他填充值,而不是空值,因为并发映射不支持空值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-10 06:54:42

您可以使用.map()代替.forEach(),并返回使用Collectors.toMap()终止函数创建的映射,而不是并行修改外部映射。考虑以下例子:

代码语言:javascript
运行
复制
Map result = x.keySet()
  .parallelStream()
  .map(req -> {
    try {
      Response response = getResponseForRequest(req);
      return new AbstractMap.SimpleEntry<>(req, response.getTitle());
    } catch (TimeoutException e) {
      return new AbstractMap.SimpleEntry<>(req, null);
    }
  })
  .collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue));

在本例中,您返回一个SimpleEntry对象,该对象表示每个元素的键和值,在处理所有条目时,将它们收集到一个映射中。

简化

Holger提出了更简化的解决方案,完全摆脱了AbstractMap.SimpleEntry

代码语言:javascript
运行
复制
Map result = x.keySet()
  .parallelStream()
  .collect(Collectors.toMap(Function.identity(), req -> {
    try {
      Response response = getResponseForRequest(req);
      return response.getTitle()
    } catch (TimeoutException e) {
      return null
    }
  }));

选择对你更有用的东西。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49747070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档