我在Java中有这样的数据结构:
ConcurrentHashMap<String, Set<String>> objects;
Set(HashSet)不是并发数据结构。
多个线程可以安全地更改ConcurrentHashMap,但是其中的Set呢? Map中的Set对象是否是线程安全的?还是ConcurrentHashMap仅为其自身提供了线程安全性?
谢谢
答案 0 :(得分:0)
Set
对象不是线程安全的。该Map不会仅仅因为它包含对该集合的引用而使其成为线程安全的。
ConcurrentHashMap
实现仅为其自身的操作(例如放置,检索,删除,内容检查等)提供线程安全。
如果通过多个线程同时修改了同一Set
,则这些修改的结果是不可预测的。
如果需要同步Set
对象,则可以考虑为ConcurrentHashMap使用Set包装器:
Set<String> set = ConcurrentHashMap.newKeySet();
或者,简单地:
Set<String> set = ...;
set = Collections.synchronizedSet(set);