八股文实战之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、分析源码

相关推荐
❥ღ Komo·13 小时前
K8s服务发现与DNS解析全解析
java·开发语言
g***B73815 小时前
Java 工程复杂性的真正来源:从语言设计到现代架构的全链路解析
java·人工智能·架构
期待のcode17 小时前
MyBatisX插件
java·数据库·后端·mybatis·springboot
醇氧20 小时前
【Windows】优雅启动:解析一个 Java 服务的后台启动脚本
java·开发语言·windows
sunxunyong20 小时前
doris运维命令
java·运维·数据库
菜鸟起航ing20 小时前
Spring AI 全方位指南:从基础入门到高级实战
java·人工智能·spring
古城小栈20 小时前
Docker 多阶段构建:Go_Java 镜像瘦身运动
java·docker·golang
MapGIS技术支持21 小时前
MapGIS Objects Java计算一个三维点到平面的距离
java·开发语言·平面·制图·mapgis
Coder_Boy_21 小时前
业务导向型技术日志首日记录(业务中使用的技术栈)
java·驱动开发·微服务
盖世英雄酱581361 天前
springboot 项目 从jdk 8 升级到jdk21 会面临哪些问题
java·后端