Collections集合静态工具可以让非同步进行同步操作的源码分析

我们都知道,Collections这个类封装了对集合操作的一些静态方法,比如,我们经常用到的集合进行排序操作sort(List<T> list) 方法.,swap(List<?> list, int i, int j),对集合中位置的替换操作。等等这些可以在Collections api文档中可以看到,在这里我就不一一解释了。我在api文档中看到,可以对非同步进行同步操作,synchronizedList
好奇心的我决定看下他的源码:
 
public static <T> List<T> synchronizedList(List<T> list) {
return (list instanceof RandomAccess ?
                new SynchronizedRandomAccessList<T>(list) :
                new SynchronizedList<T>(list));
    }

这个是通过synchronizedList这个方法点进来的。我们可以看到这个方法中new SynchronizedList<T>(list),在找到这个类
 
static class SynchronizedList<E>
extends SynchronizedCollection<E>
implements List<E> {
        static final long serialVersionUID = -7754090372962971524L;


final List<E> list;


SynchronizedList(List<E> list) {
   super(list);
   this.list = list;
}
SynchronizedList(List<E> list, Object mutex) {
            super(list, mutex);
   this.list = list;
        }
 可以看到在这里这个类,并且继承了一个类。我们暂且不管,我们可以看到他的构造方法中对这个list进行了初始化.在这个类中对其list进行一系列的操作,我们去看下他们对list做了哪些操作.
public void add(int index, E element) {
   synchronized(mutex) {list.add(index, element);}
        }
  public E remove(int index) {
   synchronized(mutex) {return list.remove(index);}
        }
当我们看到这个方法时,是不是有一种恍然大悟的感觉,在这个方法中给他加了synchronized这个锁,并且还是同一个对象
mutex由此可以说明这个是同一个锁,所以,这个Collections实现了对非同步能进行同步操作。

猜你喜欢

转载自blog.csdn.net/arryluo123/article/details/69936827
今日推荐