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

    问题解决。

  • 相关阅读:
    有个表叫杨表(上)
    Codeforces Round #698 (Div. 2) 题解 全部6题
    Leetcode 821. 字符的最短距离
    gitbook mermaid不能渲染问题
    adb命令启动app及查找系统版本号
    git库使用
    excle转html方法
    gitbook插入视频
    xcode使用技巧
    在 Mac 上的“自动操作”工作流程中使用 Shell 脚本操作
  • 原文地址:https://www.cnblogs.com/geekdc/p/10289192.html
Copyright © 2020-2023  润新知