我有ConcurrentHashMap<String, Object> concurrentMap;
我需要使用地图的键返回String []。
是以下代码:
public String[] listKeys() {
return (String[]) concurrentMap.keySet().toArray();
}
线程安全?
答案 0 :(得分:3)
虽然 ConcurrentHashMap
是一个线程安全的类,但键上使用的 Iterator
是 NOT CERTAIN < / strong>与任何后续 HashMap
更改同步,一旦创建...
来自spec:
public Set<K> keySet()
Returns a Set view of the keys contained in this map......
...........................
The view's iterator is a "weakly consistent" iterator that will
never throw ConcurrentModificationException, and guarantees to
traverse elements as they existed upon construction of the iterator,
and may (but is not guaranteed to) reflect any modifications
subsequent to construction.
答案 1 :(得分:2)
是和否。只要您扩展到范围,Threas-safe就会被模糊定义。
通常,并发集合以允许多个线程并发访问的方式实现其所有方法,或者如果它们不能提供透明地序列化这种访问(例如同步)的机制。因此,它们是安全的,因为它们确保它们保持有效的内部结构,并且方法调用给出有效的结果。
如果你看一下细节,就会开始模糊,例如: toArray()将返回集合内容的某种 snapshot 。无法保证在方法返回时内容不会被更改。因此,虽然调用是线程安全的,但结果将不满足通常的不变量(例如,数组内容可能不与集合相同)。
如果需要对并发集合的mupltiple调用范围保持一致,则需要在代码中提供调用方法的机制,以确保所需的一致性。