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

    问题解决。

  • 相关阅读:
    Linux recordmydesktop
    linux music play
    linux config NDK
    linux install wireshark
    Linux config cocos
    45 线程池都有哪些状态?
    44 创建线程池有哪几种方式?
    final 不能修饰抽象类和接口
    43 线程的 run() 和 start() 有什么区别?
    42 notify()和 notifyAll()有什么区别?
  • 原文地址:https://www.cnblogs.com/geekdc/p/10289192.html
Copyright © 2011-2022 走看看