public static void main(String[] args) {
ArrayList<Integer> integers = new ArrayList<>();
LinkedList<Integer> integers1 = new LinkedList<>();
List<String> list = Collections.synchronizedList(new ArrayList<String>());
list.add("18");//add不用加synchronized
list.add("24");
list.add("39");
synchronized (list) {
Iterator i = list.iterator(); //一定要写在同步代码块里,因为遍历的源码里没有加synchronized
while (i.hasNext()) {
System.out.println(i.next());
}
}
System.out.println(integers instanceof RandomAccess);//true
System.out.println(integers1 instanceof RandomAccess);//false
}
首先,看下Collections.synchronizedList的源码
public static <T> List<T> synchronizedList(List<T> list) {
return (list instanceof RandomAccess ?
new SynchronizedRandomAccessList<>(list) :
new SynchronizedList<>(list));
}
这是决定返回SynchronizedRandomAccessList还是SynchronizedList.一种是基于顺序表结构,一种是基于链表结构.注意:SynchronizedRandomAccessList是SynchronizedList的子类.所以我们去看父类的源码.如下(由于太长,只看重要的部分):
public void add(int index, E element) {
synchronized (mutex) {list.add(index, element);}
}
public ListIterator<E> listIterator() {
return list.listIterator(); // Must be manually synched by user
}
public ListIterator<E> listIterator(int index) {
return list.listIterator(index); // Must be manually synched by user
}
显而易见,执行add()等方法的时候,加了synchronized关键字,但是listIterator(),或者iterator()(往上层找)却没有加.所以在使用的时候需要加上synchronized.