利用CopyOnWriteArrayList解决并发修改异常问题
Posted geekdc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用CopyOnWriteArrayList解决并发修改异常问题相关的知识,希望对你有一定的参考价值。
一、需求
多个线程再获取同一个集合里面的数据同时,修改集合中的数据。
二、有问题的写法
package com.duchong.juc; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; /* * CopyOnWriteArrayList/CopyOnWriteArraySet : “写入并复制” * 注意:添加操作多时,效率低,因为每次添加时都会进行复制,开销非常的大。并发迭代操作多时可以选择。 */ public class TestCopyOnWriteArrayList { public static void main(String[] args) { HelloThread ht = new HelloThread(); for (int i = 0; i < 10; i++) { new Thread(ht).start(); } } } class HelloThread implements Runnable{ //方式一 private static List<String> list = Collections.synchronizedList(new ArrayList<String>()); static{ list.add("AA"); list.add("BB"); list.add("CC"); } @Override public void run() { Iterator<String> it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); list.add("DD"); } } }
结果:
3、CopyOnWriteArrayList
package com.duchong.juc; import java.util.Iterator; import java.util.concurrent.CopyOnWriteArrayList; /* * CopyOnWriteArrayList/CopyOnWriteArraySet : “写入并复制” * 注意:添加操作多时,效率低,因为每次添加时都会进行复制,开销非常的大。并发迭代操作多时可以选择。 */ public class TestCopyOnWriteArrayList { public static void main(String[] args) { HelloThread ht = new HelloThread(); for (int i = 0; i < 10; i++) { new Thread(ht).start(); } } } class HelloThread implements Runnable{ private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); static{ list.add("AA"); list.add("BB"); list.add("CC"); } @Override public void run() { Iterator<String> it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); list.add("DD"); } } }
问题解决。
以上是关于利用CopyOnWriteArrayList解决并发修改异常问题的主要内容,如果未能解决你的问题,请参考以下文章
CopyOnWriteArrayList操作java.lang.UnsupportedOperationException