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

相关推荐
慕y27413 分钟前
Java学习第九十三部分——RestTemplate
java·开发语言·学习
旋风菠萝16 分钟前
设计模式---单例
android·java·开发语言
AI视觉网奇43 分钟前
音频获取长度
java·前端·python
FC_nian1 小时前
IDEA配置(Maven)
java·maven·intellij-idea
汤姆yu1 小时前
基于springboot的快递分拣管理系统
java·spring boot·后端
衍生星球2 小时前
JSP 程序设计之 JSP 基础知识
java·web·jsp
m0_749317522 小时前
力扣-字母异位词
java·算法·leetcode·职场和发展
黑暗也有阳光2 小时前
java中为什么hashmap的大小必须是2倍数
java·后端
fatsheep洋2 小时前
XSS-DOM-1
java·前端·xss
七七软件开发2 小时前
一对一交友小程序 / APP 系统架构分析
java·python·小程序·系统架构·php