Java ArrayList和CopyOnWriteArrayList的区别
ArrayList和CopyOnWriteArray都实现了List接口。但是ArrayList和CopyOnWriteArrayList之间有很多区别。
- CopyOnWriteArrayList创建了一个ArrayList底层的克隆副本,对于每一个更新操作,在某一点上两者都会自动同步,这由JVM负责。因此,对正在进行读操作的线程没有影响。因此,ArrayList中不存在线程安全,而CopyOnWriteArrayList是线程安全的。
- 当一个线程遍历ArrayList对象时,如果其他线程试图进行修改,那么我们将得到Runt-time异常:ConcurrentModificationException。而在CopyOnWriteArrayList的情况下,我们不会得到任何异常。
- ArrayList是在JDK 1.2中引入的,而CopyOnWriteArrayList是由SUN公司在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