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

相关推荐
spencer_tseng1 小时前
Stream not available [SysDictDataMapper.xml]
xml·java
蒸蒸yyyyzwd5 小时前
cpp对象模型学习笔记1.1-2.8
java·笔记·学习
程序员徐师兄6 小时前
Windows JDK11 下载安装教程,适合新手
java·windows·jdk11 下载安装·jdk11 下载教程
RANCE_atttackkk6 小时前
[Java]实现使用邮箱找回密码的功能
java·开发语言·前端·spring boot·intellij-idea·idea
五岳7 小时前
DTS按业务场景批量迁移阿里云MySQL表实战(下):迁移管理平台设计与实现
java·应用·dts
zhougl9967 小时前
Java 所有关键字及规范分类
java·开发语言
Python 老手8 小时前
Python while 循环 极简核心讲解
java·python·算法
java1234_小锋8 小时前
Java高频面试题:MyISAM索引与InnoDB索引的区别?
java·开发语言
Mr_Xuhhh8 小时前
MySQL函数详解:日期、字符串、数学及其他常用函数
java·数据库·sql
测试开发Kevin9 小时前
小tip:换行符CRLF 和 LF 的区别以及二者在实际项目中的影响
java·开发语言·python