二者都 ArrayList 和 CopyOnWriteArray 实现列表接口。但是ArrayList和CopyOnWriteArrayList之间有很多区别:
null
- CopyOnWriteArrayList创建基础ArrayList的克隆副本,对于特定点的每次更新操作,这两个操作都将自动同步,由JVM负责。因此,对执行读取操作的线程没有影响。因此,ArrayList中没有线程安全,而CopyOnWriteArrayList是线程安全的。
- 当一个线程迭代ArrayList对象时,如果另一个线程尝试进行修改,那么我们将得到运行时异常ConcurrentModificationException。在CopyOnWriteArrayList的情况下,我们不会得到任何例外。
- ArrayList是在JDK 1.2中引入的,而CopyOnWriteArrayList是由SUN people在JDK 1.5中引入的。
- ArrayList的迭代器可以在迭代时执行删除操作。但是CopyOnWriteArrayList的迭代器在迭代时不能执行删除操作,否则会抛出运行时异常UnsupportedOperationException。
以下是这一点的实施。
// Java program to illustrate ArrayList import java.util.*; class CopyDemo { public static void main(String[] args) { ArrayList l = new ArrayList(); l.add( "A" ); l.add( "B" ); l.add( "C" ); Iterator itr = l.iterator(); while (itr.hasNext()) { String s = (String)itr.next(); if (s.equals( "B" )) { // Can remove itr.remove(); } } System.out.println(l); } } |
输出:
[A,C]
// Java program to illustrate CopyOnWriteArrayList import java.util.concurrent.CopyOnWriteArrayList; import java.util.*; class CopyDemo extends Thread { static CopyOnWriteArrayList l = new CopyOnWriteArrayList(); public static void main(String[] args) throws InterruptedException { l.add( "A" ); l.add( "B" ); l.add( "C" ); Iterator itr = l.iterator(); while (itr.hasNext()) { String s = (String)itr.next(); System.out.println(s); if (s.equals( "B" )) { // Throws RuntimeException itr.remove(); } Thread.sleep( 1000 ); } System.out.println(l); } } |
输出:
A B Exception in thread "main" java.lang.UnsupportedOperationException
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END