手动需要同步访问同步列表/地图/集等

时间:2012-02-27 17:58:10

标签: java

Collection类提供了各种方法来获取线程安全的集合。那么为什么有必要在迭代时手动同步访问?

1 个答案:

答案 0 :(得分:3)

每个方法都是线程安全的。如果您对同步集合进行多次调用,则除非您明确地保持锁定,否则这不是线程安全的。使用迭代器涉及隐式地多次调用迭代器,因此没有办法解决这个问题。

一些并发库集合所做的是提供弱一致性。它们提供了一种实用的解决方案,即在迭代时可能会或可能不会看到添加或删除的元素。


以不安全的方式使用的线程安全集合的简单示例。

private final List<String> list = Collections.synchronizedList(
                                              new ArrayList<String>());

list.add("hello");
String hi = list.remove(list.size()-1);

添加和删除都是线程安全的,单独使用它们不会出错。问题是另一个线程可以改变BETWEEN集合调用(不在调用内),导致此代码以多种方式中断。