首先我们看下 Collections.SynchroizedList:
可以发现 在以 synchronized 关键字 为基础做线程安全操作时,如果使用了迭代器,去遍历读取,外层并没有加锁 则这个时候会有问题 固,在 使用迭代器 时要在外层 加 synchronized 关键字,问题来了 对什么对象假的锁呢 mutex 是哪个对象?
接着看:Collections.SynchronizedList 的父类:
没错就是this 对象也就是 当前线程安全的list对象;
所以我们要这样写:
func(){
List list = Collections.synchronizedList(new ArrayList());
...
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
...
}