Java中的集合迭代不是线程安全的,即使您使用的是同步包装器(
Collections.synchronizedMap(...))之一:
当遍历其任何集合视图时,用户必须手动在返回的地图上进行同步:
Map m = Collections.synchronizedMap(new HashMap());...Set s = m.keySet(); // Needn't be in synchronized block...synchronized(m) { // Synchronizing on m, not s! Iterator i = s.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next());}
Java Collection
framework文档
对同步集合的其他调用是安全的,因为包装器类将它们包围在
synchronized块中,这些块将包装器集合用作其监视器:
public int size() { synchronized( this ) { return collection.size(); }}与
collection原始的收藏。这适用于集合/映射公开的所有方法,迭代方法除外。
映射的键集以相同的方式进行同步:同步的包装器根本不返回原始键集。相反,它返回集合原始键集的特殊同步包装器。条目集和值集也是如此。



