static class SynchronizedList extends SynchronizedCollection implements List { private static final long serialVersionUID = -7754090372962971524L; final List list; SynchronizedList(List list) { super(list); this.list = list; } public E get(int index) { synchronized (mutex) {return list.get(index);} } public E set(int index, E element) { synchronized (mutex) {return list.set(index, element);} } public void add(int index, E element) { synchronized (mutex) {list.add(index, element);} } public E remove(int index) { synchronized (mutex) {return list.remove(index);} } static class SynchronizedCollection implements Collection, Serializable { private static final long serialVersionUID = 3053995032091335093L; final Collection c; // Backing Collection final Object mutex; // Object on which to synchronize
/** * @serial include */ static class SynchronizedList extends SynchronizedCollection implements List { private static final long serialVersionUID = -7754090372962971524L; final List list; SynchronizedList(List list) { super(list); this.list = list; } SynchronizedList(List list, Object mutex) { super(list, mutex); this.list = list; }
复制代码
这里只是列举SynchronizedList ,其他类类似,可以看下源码了解下。
测试
public class Main { public static void main(String[] args) { List names = new LinkedList(); names.add("sub"); names.add("jobs"); // 同步方法1 内部使用lock long a = System.currentTimeMillis(); List strings = new CopyOnWriteArrayList(names); for (int i = 0; i < 100000; i++) { strings.add("param1"); } long b = System.currentTimeMillis(); // 同步方法2 装饰器模式使用 synchronized List synchronizedList = Collections.synchronizedList(names); for (int i = 0; i < 100000; i++) { synchronizedList.add("param2"); } long c = System.currentTimeMillis(); System.out.println("CopyOnWriteArrayList time == "+(b-a)); System.out.println("Collections.synchronizedList time == "+(c-b)); }}