java – 使用Collections.synchronizedSet的每个语法

问题是这个.我做了一套

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实例,那么显然迭代器也会不同.

上一篇:(Java)如果HashSet不同步,为什么允许同步使用HashSet?


下一篇:c# – 多个线程在等待一个事件?