Collections.synchronizedList(List list)用法解析

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.

经验分享 程序员 微信小程序 职场和发展