java - 这种传递和修改 HashMap 的方式是线程安全的吗

标签 java multithreading concurrency thread-safety

这是一小段代码

public Map<String,Object> findTruckParts(Map<String,Object> output){
Map<String,Object>findPartsMap = null;
NewFooInstance newFooInstance = new NewFooInstance();
findPartsMap = PartBuilder.buildPartsOutputMap(output, outputMap);
newFooInstance.buildItem(findPartsMap);
return findPartsMap;
}

outputMap 是一个新的 hashMap,输出是带有一些备件信息的 hashmap。 buildItem 调用传递 findPartsMap 的其他一些私有(private)方法。

public class NewFooInstance{
buildItem(Map<String,Object> partsMap){
checkPartsValidity(partsMap, fetchMapOfValidParts());
}

checkPartsValidity(Map<String,Object> partsMap,Map<String,Object> partsMap){
//partsMap = update partsMap with missing items fetched from list of valid parts
}
}

上面的线程安全吗?由于所有映射对于各自的方法都是本地的,所以我的假设是这是线程安全的。
编辑:我稍微修改了方法。获取一张 map 并返回另一张 map 。所以,我的问题是,返回的这张 map 是线程安全的吗?它对于该方法来说是本地的,所以我认为这将是线程安全的(如果该映射丢失其监视器,其他线程进入将无法更改其值),但是,因为该映射正在其他类和其他方法中进行修改,该映射的方法局部性是否可以跨不同的类/方法延续并确保线程安全?

最佳答案

答案是“不”,因为HashMap本身不是线程安全的。

考虑使用线程安全的 Map 实现,例如 ConcurrentHashMap .

关于java - 这种传递和修改 HashMap 的方式是线程安全的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822476/

相关文章:

multithreading - 数量逻辑 CPU 是否会影响 Java8 Streams 性能?

android - HTC Desire 中的数据库锁定问题

java - 在等待 api 调用完成时并行调用 N 阻塞 api 调用以充分利用 CPU 的最佳方法是什么?

c++ - 在 Qt 中运行一个单独的进程或线程

java - Java Comparator.comparing() 类型签名是什么意思?

java - 日期 天数和时间的差异

java.util.ConcurrentModificationException 和迭代?

java - 不支持的功能异常 fetchDmlReturnParams

java - Spring Boot 共享线程

c++ - 多个 OpenMP 线程读取(不写入)共享变量的性能成本?