java HashMap:多个读卡器和一个写卡器的多线程访问安全吗?
我正在读^{
If multiple threads access this map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally.
它是什么意思“it”可以解释为修改映射的线程,也可以解释为映射本身
“多线程阅读安全”和“有作者时仅在单线程上安全”的案例都是不假思索的(至少对我来说是如此),这让我相信,在文档中明确地调用“多个读卡器和单个写卡器”案例意味着该语句应该被解释为“多线程读取和单线程写入是安全的”,而不是简单的“当您有一个写卡器时锁定所有内容”
更重要的是,中的哈希表实现。Net(明确地)记录为:
Hashtable is thread safe for use by multiple reader threads and a single writing thread
(默认情况下,.Net类不是线程安全的),所以“多个读线程和一个写线程”的情况肯定有一些问题
# 1 楼答案
地图本身。HashMap不是线程安全的
看看ConcurrentHashMap,这是一个线程安全的映射
你也可以自己管理。代码可能如下所示
更安全的是,返回值对象的副本以避免意外行为
这将只允许
put
方法修改映射。所有操作都是线程安全的# 2 楼答案
当线程“从结构上修改映射”时,内部元素处于不确定状态,因此读取可能会受到影响。因此,需要使用映射外部的某种方法来同步读写
也许是这本书的作者。Net库在更新期间更小心地保持其内部结构处于确定状态