目录

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

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
chian-ocean1 小时前
解密 Linux 线程:多线程编程与资源管理
java·linux·redis
re1ife1 小时前
Android Studio开发知识:从基础到进阶
android·java·开发语言·android studio
callJJ2 小时前
从零开始的图论讲解(1)——图的概念,图的存储,图的遍历与图的拓扑排序
java·数据结构·算法·深度优先·图论·广度优先·图搜索算法
喜欢便码4 小时前
JS小练习0.1——弹出姓名
java·前端·javascript
王磊鑫5 小时前
重返JAVA之路-初识JAVA
java·开发语言
半兽先生6 小时前
WebRtc 视频流卡顿黑屏解决方案
java·前端·webrtc
南星沐7 小时前
Spring Boot 常用依赖介绍
java·前端·spring boot
代码不停7 小时前
Java中的异常
java·开发语言
何似在人间5758 小时前
多级缓存模型设计
java·jvm·redis·缓存
多云的夏天8 小时前
ubuntu24.04-MyEclipse的项目导入到 IDEA中
java·intellij-idea·myeclipse