https://www.cnblogs.com/hongdada/p/10931891.html

使用方式

官方文档就是下面的使用方式

  1. List list = Collections.synchronizedList(new ArrayList());
  2. ...
  3. synchronized (list) {
  4. Iterator i = list.iterator(); // Must be in synchronized block
  5. while (i.hasNext())
  6. foo(i.next());
  7. }

既然封装类内部已经加了对象锁,为什么外部还要加一层对象锁?
看源码可知,Collections.synchronizedList中很多方法,比如equals, hasCode, get, set, add, remove, indexOf, lastIndexOf 都添加了锁,但是List中

  1. Iterator<E> iterator();

这个方法没有加锁,不是线程安全的,所以如果要遍历,还是必须要在外面加一层锁。