并发数据结构中非并发数据结构的线程安全

时间:2019-04-10 10:26:02

标签: java multithreading

我在Java中有这样的数据结构:

ConcurrentHashMap<String, Set<String>> objects; 

Set(HashSet)不是并发数据结构。

多个线程可以安全地更改ConcurrentHashMap,但是其中的Set呢? Map中的Set对象是否是线程安全的?还是ConcurrentHashMap仅为其自身提供了线程安全性?

谢谢

1 个答案:

答案 0 :(得分:0)

地图中的

Set对象不是线程安全的。该Map不会仅仅因为它包含对该集合的引用而使其成为线程安全的。

ConcurrentHashMap实现仅为其自身的操作(例如放置,检索,删除,内容检查等)提供线程安全。

如果通过多个线程同时修改了同一Set,则这些修改的结果是不可预测的。

如果需要同步Set对象,则可以考虑为ConcurrentHashMap使用Set包装器:

Set<String> set = ConcurrentHashMap.newKeySet();

或者,简单地:

Set<String> set = ...;
set = Collections.synchronizedSet(set);