利用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");
		}

	}

}

问题解决。

原文地址:https://www.cnblogs.com/geekdc/p/10289192.html