ArrayList线程安全问题

简介: 自己的博客地址:http://www.lixiang.red/tech/java/2018/02/05/arrayList-mutiThread.html欢迎点击,更多好技术好文在等着您!验证思路新建若干个(1000)个线程,一个全局arraylist. 然后往ArrayList中添加东西。

自己的博客地址:http://www.lixiang.red/tech/java/2018/02/05/arrayList-mutiThread.html
欢迎点击,更多好技术好文在等着您!

验证思路

新建若干个(1000)个线程,一个全局arraylist. 然后往ArrayList中添加东西。 代码和结果见下图

代码展示

//初始化全局的ArrayList
private  List<Object> list = new ArrayList<>();
//初始化用于控制线程同时开始的 countDownLatch
private  CountDownLatch countDownLatch = new CountDownLatch(10000);
public void run() {
        //线程重写的run方法
        //每次新建一个Object并添加到list中
        Object object = new Object();
        list.add(object);
        countDownLatch.countDown();
    }
//main函数里面的执行逻辑 
        for (int i = 0; i <10000 ; i++) {
            IS_ArrayVector arrayVector = new IS_ArrayVector();
            Thread thread = new Thread(arrayVector);
            thread.start();
        }

        countDownLatch.await();
        System.out.println(list.size());

程序运行结果

[图片上传失败...(image-44fc15-1517832743106)]

源码分析

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

从ArrayList的源代码可见主要问题出在size++上。

size++分为三步:a.取size值,b.加1,c.再把值赋给size。

在此时,如果两个线程同时执行到 a 步。 假设限得值为2。都分别加1得到结果3,再把3赋给size。 最后size的值为3 。 但实际上是执行了两次add。

总结

在平时的javaWeb开发中可能接触不到多线程的问题,但这种问题不能忽略!为啥?? 面试时升职加薪你要不要??!!
注:需要项目源码的可以扫下方左侧二维码关注我哦

img_a83ac4a842d5464435a478ed58bfbf7b.jpe
微笑的小小刀

相关文章
|
10月前
|
安全 Java 程序员
ArrayList vs Vector:一场线程安全与性能优化的世纪之争!
在 Java 面试中,ArrayList 和 Vector 是高频考点,但很多人容易混淆。本文通过10分钟深入解析它们的区别,帮助你快速掌握性能、线程安全性、扩容机制等核心知识,让你轻松应对面试题目,提升自信!
206 18
|
12月前
|
存储 安全 Java
代码审查:从 ArrayList 说线程安全
我们在编码和做代码审查的过程中,要对涉及到多线程使用的场景时刻绷着一根弦,将隐患拒之门外。
161 4
|
存储 安全
ArrayList在非线程安全情况下的问题及解决方法
ArrayList在非线程安全情况下的问题及解决方法
119 0
|
安全 容器
线程安全的集合类(多线程环境下使用ArrayList、队列及哈希表)
线程安全的集合类(多线程环境下使用ArrayList、队列及哈希表)
|
Java 容器
第二季:4我们知道ArrayList是线程不安全,请编码写一个不安全的案例并给出解决方案。【Java面试题】
第二季:4我们知道ArrayList是线程不安全,请编码写一个不安全的案例并给出解决方案。【Java面试题】
127 0
|
NoSQL 安全 Java
案例15-ArrayList线程不安全,共用全局变量导致数据错乱问题,占用内存情况
案例15-ArrayList线程不安全,共用全局变量导致数据错乱问题,占用内存情况
|
安全 NoSQL Java
28个案例问题分析---15---登陆之后我加入的课程调用接口报错--ArrayList线程不安全。占用内存情况
28个案例问题分析---15---登陆之后我加入的课程调用接口报错--ArrayList线程不安全。占用内存情况
167 0
|
安全 API
JUC学习(五):ArrayList的线程安全问题分析与解决方案(vector、Collections、写时复制技术)
JUC学习(五):ArrayList的线程安全问题分析与解决方案(vector、Collections、写时复制技术)
207 0
JUC学习(五):ArrayList的线程安全问题分析与解决方案(vector、Collections、写时复制技术)
|
Java 容器
Java——多线程高并发系列之ArrayList、HashSet、HashMap集合线程不安全的解决方案
Java——多线程高并发系列之ArrayList、HashSet、HashMap集合线程不安全的解决方案
Java——多线程高并发系列之ArrayList、HashSet、HashMap集合线程不安全的解决方案
|
缓存 安全 Java
看山聊并发:如果非要在多线程中使用 ArrayList 会发生什么?(第二篇)
前面写过一篇文章 《如果非要在多线程中使用 ArrayList 会发生什么?》,有读者反馈,Java 11 代码已经修复,还会出现 null 元素。 为了便于理解,当时只是通过代码执行顺序说明了异常原因。
178 0
看山聊并发:如果非要在多线程中使用 ArrayList 会发生什么?(第二篇)