当出现Java同步时,有很多主题。在其中许多建议使用Collections.synchronized {Collecation,List,Map,Set,SortedMap,SortedSet}的invokation而不是Collection,List等,以便多线程工作到线程安全访问。
让我们想象一下某些线程存在的情况,并且所有线程都需要通过在其体内同步阻塞的方法来访问集合。
那么,是否有必要使用:
Collection collection = Collections.synchronizedCollection(new ArrayList<T>());
或仅
Collection collection = new ArrayList<String>();
需要吗?
也许你可以告诉我一个例子,当第二次尝试而不是第一次尝试会导致明显不正确的行为?
答案 0 :(得分:3)
相反,Collections.synchronizedCollection()
通常是不够的,因为许多操作(如迭代,检查然后添加等)需要额外的显式同步。
如果对集合的每次访问都是通过正确同步的方法完成的,那么将集合再次包装到同步代理中是没用的。
答案 1 :(得分:0)
不,如果您的访问方法已同步,则无需使用同步集合。
Collection collection = new ArrayList<String>();
在这种情况下会做得很好。
答案 2 :(得分:0)
如果您已安排正确同步代码,则绝对不需要在较低粒度级别上进行另一层同步。
请确认当你说
所有这些都需要通过在其体内同步块的方法来访问集合。
所有这些块都使用相同的锁。仅涉及某些同步块是不够的。