zoukankan      html  css  js  c++  java
  • 利用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");
    		}
    
    	}
    
    }
    

    问题解决。

  • 相关阅读:
    JavaWeb 期末设计 测试部署
    JavaWeb 期末项目设计 业务逻辑与实现
    JavaEE期末设计-银行转账系统需求文档分析
    Lamda 表达式
    Spring AOP capabilities and goals
    LDAP & Implement
    RESTful levels & HATEOAS
    Servlet CDI
    spring 历史&哲学
    mysql backup & recovery
  • 原文地址:https://www.cnblogs.com/geekdc/p/10289192.html
Copyright © 2011-2022 走看看