访问方法同步时,集合是否需要同步(通过Collections.synchronizedX)?

时间:2014-04-06 11:28:12

标签: java multithreading synchronization

当出现Java同步时,有很多主题。在其中许多建议使用Collections.synchronized {Collecation,List,Map,Set,SortedMap,SortedSet}的invokation而不是Collection,List等,以便多线程工作到线程安全访问。

让我们想象一下某些线程存在的情况,并且所有线程都需要通过在其体内同步阻塞的方法来访问集合。

那么,是否有必要使用:

    Collection collection = Collections.synchronizedCollection(new ArrayList<T>());

或仅

    Collection collection = new ArrayList<String>();

需要吗?

也许你可以告诉我一个例子,当第二次尝试而不是第一次尝试会导致明显不正确的行为?

3 个答案:

答案 0 :(得分:3)

相反,Collections.synchronizedCollection()通常是不够的,因为许多操作(如迭代,检查然后添加等)需要额外的显式同步。

如果对集合的每次访问都是通过正确同步的方法完成的,那么将集合再次包装到同步代理中是没用的。

答案 1 :(得分:0)

不,如果您的访问方法已同步,则无需使用同步集合。

Collection collection = new ArrayList<String>();

在这种情况下会做得很好。

答案 2 :(得分:0)

如果您已安排正确同步代码,则绝对不需要在较低粒度级别上进行另一层同步。

请确认当你说

  

所有这些都需要通过在其体内同步块的方法来访问集合。

所有这些块都使用相同的锁。仅涉及某些同步块是不够的。