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

相关推荐
南宫生1 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
计算机毕设定制辅导-无忧学长1 小时前
Maven 基础环境搭建与配置(一)
java·maven
风与沙的较量丶2 小时前
Java中的局部变量和成员变量在内存中的位置
java·开发语言
m0_748251722 小时前
SpringBoot3 升级介绍
java
极客先躯4 小时前
说说高级java每日一道面试题-2025年2月13日-数据库篇-请说说 MySQL 数据库的锁 ?
java·数据库·mysql·数据库的锁·模式分·粒度分·属性分
程序员侠客行4 小时前
Spring事务原理 二
java·后端·spring
小猫猫猫◍˃ᵕ˂◍4 小时前
备忘录模式:快速恢复原始数据
android·java·备忘录模式
liuyuzhongcc4 小时前
List 接口中的 sort 和 forEach 方法
java·数据结构·python·list
五月茶4 小时前
Spring MVC
java·spring·mvc
sjsjsbbsbsn4 小时前
Spring Boot定时任务原理
java·spring boot·后端