aNa*_*ame 2 java collections java.util.concurrent
我正在阅读有关包装器实现的java官方文档,它们是集合中用于获取同步集合的静态方法,例如:List<Type> list = Collections.synchronizedList(new ArrayList<Type>());
...
我不明白的事情如下(我引用自java文档):
以这种方式创建的集合与通常同步的集合(例如 Vector)一样是线程安全的。面对并发访问,用户在迭代返回的集合时必须手动同步它。原因是迭代是通过对集合的多次调用来完成的,必须将其组合成单个原子操作......
它如何能够是线程安全的,并且需要在迭代时手动同步?
它是线程安全的,因为它的每个单独方法都是线程安全的,但如果您对集合执行复合操作,那么您的代码将面临并发问题的风险。
前任:
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()。
| 归档时间: |
|
| 查看次数: |
894 次 |
| 最近记录: |