赞
踩
写时复制(Copy-on-write,COW,奶牛)是一种计算机程序设计领域的优化策略。
多个调用者读操作读指针指向的同一资源,只在调用者写时,复制一个资源的副本,写完后再用副本替换老资源。
ArrayList线程不安全,Vector 和 Collections.SynchronizedXxx 线程安全。
Vector通过在每个方法声明处都用synchronized关键字修饰来保证线程安全:
Collections.SynchronizedXxx通过在每个方法内都用synchronized关键字封装具体操作来保证线程安全:
但是,容器线程安全,并不意味着并发时可以放心大胆使用,也得注意使用方法,如:
public class CopyOnWriteTest { public static void main(String[] args) { Vector<Integer> vector = new Vector<>(); vector.add(1); vector.add(2); vector.add(3); vector.add(4); vector.add(5); for (Integer item : vector) { new Thread(vector::clear).start(); System.out.println(item); } } }
执行结果:
1
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.Vector$Itr.checkForComodification(Vector.java:1210)
at java.util.Vector$Itr.next(Vector.java:1163)
at com.wkw.study.copyonwrite.CopyOnWriteTest.main(CopyOnWriteTest.java:20)
根本原因是Vector继承了AbstractList,而AbstractList维护了容器修改次数modCount
,每次Vector修改时modCount
都会加1,但是,Vector的迭代器:
/** * Returns an iterator over the elements in this list in proper sequence. * * <p>The returned iterator is <a href=" "><i>fail-fast</i></a >. * * @return an iterator over the elements in this list in proper sequence */ public synchronized Iterator<E> iterator() { return new Itr(); } /** * An optimized version of AbstractList.Itr */ private class Itr implements Iterator<E> { int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; public E next() { synchronized (Vector.this) { checkForComodification(); int i = cursor; if (i >= elementCount) throw new NoSuchElementException(); cursor = i + 1;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。