理解java的同步集合

aNa*_*ame 2 java collections java.util.concurrent

我正在阅读有关包装器实现的java官方文档,它们是集合中用于获取同步集合的静态方法,例如:List<Type> list = Collections.synchronizedList(new ArrayList<Type>()); ...
我不明白的事情如下(我引用自java文档):

以这种方式创建的集合与通常同步的集合(例如 Vector)一样是线程安全的。面对并发访问,用户在迭代返回的集合时必须手动同步它。原因是迭代是通过对集合的多次调用来完成的,必须将其组合成单个原子操作......

它如何能够是线程安全的,并且需要在迭代时手动同步?

Ram*_*lfc 5

它是线程安全的,因为它的每个单独方法都是线程安全的,但如果您对集合执行复合操作,那么您的代码将面临并发问题的风险。

前任:

List<String> synchronizedList = Collections.synchronizedList(someList);
synchronizedList.add(whatever); // this is thread safe
Run Code Online (Sandbox Code Playgroud)

单个方法add()是线程安全的,但如果我执行以下操作:

List<String> synchronizedList = Collections.synchronizedList(someList);
if(!synchronizedList.contains(whatever))
       synchronizedList.add(whatever); // this is not thread safe
Run Code Online (Sandbox Code Playgroud)

if-then-add 操作不是线程安全的,因为检查whatever后其他线程可能已添加到列表中 contains()