【发布时间】:2014-10-04 18:51:35
【问题描述】:
在 Collections javadoc 中如下所述..
当迭代其任何集合视图时,用户必须在返回的地图上手动同步:
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());
}
我的问题是,如果我声明了一个 Hashtable,我可以在不同步的情况下使用它。 如下所示
Hashtable ht = new Hashtable();
Set s = m.keySet();
Iterator i = s.iterator();
while (i.hasNext())
foo(i.next());
【问题讨论】:
-
Hashtable不是同步地图。请改用ConcurrentHashMap。 -
@LuiggiMendoza 这是一张地图,它是同步的。怎么不是同步地图?
-
你在哪里使用
ht? -
我认为您不了解线程安全性和一致性的根本不同点。当然,您可以不同步地循环,也可以对同步的
HashMap执行相同的操作。但生成的输出只会与Map中的内容略微一致。ConcurrentHashMap没有区别。 -
看能否被其他线程修改。
标签: java collections hashmap hashtable synchronized