问题是这个.我做了一套
Set<User> users = Collections.synchronizedSet(new HashSet<User>())
...
for(User u : users){
//do something with u
}
现在,根据Java文档.
It is imperative that the user
manually synchronize on the returned
sorted set when iterating over it or
any of its subSet, headSet, or tailSet
views.06001
我很确定每个语法使用迭代器,但我不确定是否应该使用synchronized块为每个循环包装每个.
另一件事,我的IDE(IntelliJ IDEA)一直报告说,在非最终字段上使用synchronized块不太可能具有有用的语义,因为不同的线程可能是不同的对象,即使在处理同一个对象时也是如此.
解决方法:
>我是否应该为每个for循环包装…不,你不需要用同步块包装每个for循环,事实上你甚至不应该这样做,因为它会带来性能损失.您需要仅包含那些迭代可能同时由多个线程访问的集合的循环.
>我的IDE(IntelliJ IDEA)继续报告….在你的特定情况下,这不是问题,因为如果不同的线程有不同的s实例,那么显然迭代器也会不同.