Is setting a HashMap thread safe?

后端 未结 4 2084
北荒
北荒 2021-02-20 10:39

I have a HashMap in my program which is accessed by multiple threads, and is occasionally set by a single thread.

For example:

Map

        
4条回答
  •  暖寄归人
    2021-02-20 11:06

    First off, Java's HashMap class is not thread safe, so there are no guarantees when reads and writes are happening concurrently.

    However, since reads and writes to references in Java are atomic, then the pattern you described could be thread-safe as long as the refresh code is not mutating the old map. For example, the following would be fine:

    // this refresh code would be thread-safe
    Map copy = new HashMap(myMap);
    copy.put(x, y); // change the map
    myMap = copy;
    
    // you might also consider
    myMap = Collections.unmodifiableMap(copy);
    // to make sure that the non-thread-safe map will never be mutated
    

    One thing to consider with this pattern is that you may want the myMap field to be declared as volatile so that all threads will get the most recent version of myMap whenever they read from that variable.

    Finally, as other posters have mentioned ConcurrentHashMap may be a better approach depending on the complexity of the refresh code. One disadvantage of ConcurrentHashMap is that it doesn't offer any way to batch the operations, so you'd have to make sure that the state at every point during the refresh process was valid for the rest of your application to consume.

提交回复
热议问题