java – 在并行流中的hashmap中插入值时的线程安全性
发布时间:2020-12-15 08:25:52 所属栏目:Java 来源:网络整理
导读:我需要使用10秒的超时进行异步调用,并且需要对映射中的每个元素执行此操作.异步调用的结果存储在另一个映射中.在这种情况下使用HashMap是安全的还是我需要使用ConcurrentMap? MapString,String x = ArrayListMultimap.create();MapString,Boolean value = M
我需要使用10秒的超时进行异步调用,并且需要对映射中的每个元素执行此操作.异步调用的结果存储在另一个映射中.在这种情况下使用HashMap是安全的还是我需要使用ConcurrentMap?
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,并考虑一些其他填充值而不是null,因为Concurrent map不支持null值. 解决方法
您可以使用.map()而不是.forEach()并返回使用Collectors.toMap()终止函数创建的映射,而不是并行修改外部映射.考虑以下示例:
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建议更简化的解决方案: Map result = x.keySet() .parallelStream() .collect(Collectors.toMap(Function.identity(),req -> { try { Response response = getResponseForRequest(req); return response.getTitle() } catch (TimeoutException e) { return null } })); 选择任何更适合你的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |