Java ArrayList和CopyOnWriteArrayList的区别

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程