Collection类提供了各种方法来获取线程安全的集合。那么为什么有必要在迭代时手动同步访问?
答案 0 :(得分:3)
每个方法都是线程安全的。如果您对同步集合进行多次调用,则除非您明确地保持锁定,否则这不是线程安全的。使用迭代器涉及隐式地多次调用迭代器,因此没有办法解决这个问题。
一些并发库集合所做的是提供弱一致性。它们提供了一种实用的解决方案,即在迭代时可能会或可能不会看到添加或删除的元素。
以不安全的方式使用的线程安全集合的简单示例。
private final List<String> list = Collections.synchronizedList(
new ArrayList<String>());
list.add("hello");
String hi = list.remove(list.size()-1);
添加和删除都是线程安全的,单独使用它们不会出错。问题是另一个线程可以改变BETWEEN集合调用(不在调用内),导致此代码以多种方式中断。