ArrayList类线程不安全的解决方法

/**
 * 描述: ArrayList线程不安全由于add方法没加锁,多线程高并发情况下java.util.ConcurrentModiricationException异常
 *
 * @author [email protected]
 * @create 2020/2/21 13:30
 * @since 2.16.3
 */
public class ArrayList {

    public static void main(String[] args) {
        List<String> list = new java.util.ArrayList<>();
        for (int i = 1; i <= 30; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 8));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }

        /**
         * 1.高并发情况下出现的故障现象:java.util.ConcurrentModificationException
         * 2.解决方法:
         *      new Vector()
         *      Collections.synchronizedList(new ArrayList())
         *      new CopyOnWriteArrayList();(JUC包)
         * 3.CopyOnWrite容器即写时复制的容器,往一个容器中添加元素的时候,不直接往当前容器Object[]添加,而是先将当前容器Object[]进行copy,
         *   复制出一个新的容器Object[] newElements,然后新的容器Object[] newElements里添加元素,添加完元素之后,
         *   再将原容器的引用指向新的容器,setArray(newElements),这样做的好处是可以对CopyOnWrite容器进行并发的读,
         *   而不需要加锁,因为当前容器不会添加任何元素,所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
         */
    }
}
发布了254 篇原创文章 · 获赞 18 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36594703/article/details/104435593
今日推荐