码迷,mamicode.com
首页 > 其他好文 > 详细

利用CopyOnWriteArrayList解决并发修改异常问题

时间:2019-01-18 20:03:12      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:写入   ++   arraylist   pac   public   效率   ext   override   current   

一、需求

   多个线程再获取同一个集合里面的数据同时,修改集合中的数据。

二、有问题的写法

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解决并发修改异常问题

标签:写入   ++   arraylist   pac   public   效率   ext   override   current   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!