有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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类不是线程安全的),所以“多个读线程和一个写线程”的情况肯定有一些问题


共 (2) 个答案

  1. # 1 楼答案

    地图本身。HashMap不是线程安全的

    看看ConcurrentHashMap,这是一个线程安全的映射

    你也可以自己管理。代码可能如下所示

    class SomeClass {
    
        private Map<Object, Object> map = new HashMap<Object, Object>();
    
        public synchronized void put(Object key, Object value) {
            map.put(key, value);
        }
    
        public synchronized Object get(Object key) {
            return map.get(key);
        }
    }
    

    更安全的是,返回值对象的副本以避免意外行为

    public synchronized ValueType get(Object key) {
        return map.get(key).clone(); // assume that the ValueType implements Cloneable
        // of course, you can return a copy in many ways you like
    }
    

    这将只允许put方法修改映射。所有操作都是线程安全的

  2. # 2 楼答案

    当线程“从结构上修改映射”时,内部元素处于不确定状态,因此读取可能会受到影响。因此,需要使用映射外部的某种方法来同步读写

    也许是这本书的作者。Net库在更新期间更小心地保持其内部结构处于确定状态