我了解像Hashtable这样的集合是同步的,但是有人可以向我解释它是 如何
工作的,在什么时候访问仅限于并发调用?例如,假设我使用了一些像这样的迭代器:
Hashtable<Integer,Integer> map = new Hashtable<Integer,Integer>();
void dosomething1(){
for (Iterator<Map.Entry<Integer,Integer>> i = map.entrySet().iterator(); i.hasNext();){
// do something
}
}
void dosomething2(){
for (Iterator<Map.Entry<Integer,Integer>> i = map.entrySet().iterator(); i.hasNext();){
// do something
// and remove it
i.remove();
}
}
void putsomething(int a, int b){
map.put(a,b);
}
void removesomething(int a){
map.remove(a);
}
var clear(){
map = new Hashtable<Integer,Integer>();
}
有人可以解释一下从不同线程中随机调用这些函数是否有陷阱吗?特别是,迭代器如何进行同步,尤其是在使用entrySet()时,似乎也需要同步?如果在循环之一进行时调用clear()会发生什么?如果removesomething()删除了dosomething1()中并发循环尚未处理的项目,该怎么办?
谢谢你的帮助!
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文档
对同步集合的其他调用是html" target="_blank">安全的,因为包装器类将它们包围在synchronized
块中,这些块将包装器集合用作其监视器:
public int size() {
synchronized( this ) {
return collection.size();
}
}
与collection
原始的收藏。这适用于集合/映射公开的所有方法,迭代方法除外。
映射的键集以相同的方式进行同步:同步的包装器根本不返回原始键集。相反,它返回集合原始键集的特殊同步包装器。条目集和值集也是如此。
我有一个包含私有可变数据列表的类。 我需要在以下条件下公开列表项: 列表不应在外部可修改; 对于使用 getter 函数的开发人员来说,应该很清楚,他们获得的列表不能被修改。 哪个getter函数应该标记为推荐方法?或者您能提供更好的解决方案吗? UPD:这个问题来自关于列表getter实现的最佳实践的真正代码审查讨论
Iterator(迭代器)是一个接口,它的作用就是遍历容器的所有元素,也是 Java 集合框架的成员,但它与 Collection 和 Map 系列的集合不一样,Collection 和 Map 系列集合主要用于盛装其他对象,而 Iterator 则主要用于遍历(即迭代访问)Collection 集合中的元素。 Iterator 接口隐藏了各种 Collection 实现类的底层细节,向应用程序提
嗨,伙计们,我把这个作为面试问题来回答,但我遇到了麻烦。我熟悉泛型/集合 问题是:所提供的工作区中包含cocI,它是一个类的开始,该类实现了一个迭代器,可用于迭代集合集合。集合集合被传递到类的构造函数中。迭代器应该首先遍历内容深度。 例如,如果集合集合如下所示: 然后迭代器应按以下顺序返回内容:“A”、“B”、“C”、“D”、“E”、“F” Q.在cocI中提供hasNext()和next()方法
} 正如您所看到的,RetryHandler扩展了线程,该线程在内部列表上迭代。尽管使用了和,我还是得到了和已在其他
原文: http://exploringjs.com/impatient-js/ch_sync-iteration.html 27.1。什么是同步迭代? 同步迭代是一个 _ 协议 _(接口加上使用它们的规则),它连接 JavaScript 中的两组实体: **数据来源:**一方面,数据有各种形状和大小。在 JavaScript 的标准库中,您有线性数据结构 Array,有序集合 Set(元素按添加
问题内容: 在Java中为集合的集合设计一个迭代器。迭代器应隐藏嵌套,使您可以迭代属于所有集合的所有元素,就像使用单个集合一样 问题答案: 这是一个可能的实现。请注意,我没有执行remove():