利用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

CopyOnWriteArrayList 源码解读

CopyOnWriteArrayList实现原理及源码分析

16.并发容器之CopyOnWriteArrayList

Java并发编程之CopyOnWriteArrayList源码分析

Java并发-CopyOnWriteArrayList