八股文实战之JUC:ArrayList不安全性

一、ConcurrentModificationException

复制代码
package com.example.mp.juc.unsafe;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * @author Mr.Lan
 * @version 1.0
 * @ClassName ListTest$
 * @description TODO
 * @date 2025/2/22 21:28
 **/
public class ListTest1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }
}

二、原因分析:

多个线程调用的时候(比如list),在读取的时候是固定的,但在写入的时候(可能存在覆盖操作)

三、常见的解决方案

1)vector、CopyOnWriteArrayList

2)使用Collections.synchronizedList封装

verctor原理:使用synchronized(效率低,因为只能允许一个线程操作)

CopyOnWriteArrayList原理: 写入的时候(可能存在覆盖操作) =====>读写分离的思想(写入时复制一份给调用者 调用者写完 直接插入即可【防止写入时覆盖,造成数据问题】)lock锁

源码:将整个列表复制一份然后插入数据 然后更新

学习方案记录:1、先回用 2、货比三家、找不同解决方案 3、分析源码

相关推荐
程序员清风17 小时前
快手二面:乐观锁是怎么用它来处理多线程问题的?
java·后端·面试
一线大码17 小时前
SpringBoot 优雅实现接口的多实现类方式
java·spring boot·后端
花伤情犹在17 小时前
Java Stream 高级应用:优雅地扁平化(FlatMap)递归树形结构数据
java·stream·function·flatmap
yaoxin52112317 小时前
212. Java 函数式编程风格 - Java 编程风格转换:命令式 vs 函数式(以循环为例)
java·开发语言
摇滚侠17 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 属性优先级 行内写法 变量选择 笔记42
java·spring boot·笔记
滑水滑成滑头17 小时前
**发散创新:多智能体系统的探索与实践**随着人工智能技术的飞速发展,多智能体系统作为当今研究的热点领域,正受到越来越多关注
java·网络·人工智能·python
摇滚侠18 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 总结 热部署 常用配置 笔记44
java·spring boot·笔记
十年小站18 小时前
一、新建一个SpringBoot3项目
java·spring boot
2401_8414956418 小时前
【数据结构】最长的最短路径的求解
java·数据结构·c++·python·算法·最短路径·图搜索
麦麦鸡腿堡18 小时前
Java的代码块介绍与快速入门
java·开发语言