ArrayList线程不安全详解

原创 2015年07月08日 15:33:19

首先需要了解什么是线程安全:线程安全就是说多线程访问同一代码(对象、变量等),不会产生不确定的结果。 既然说ArrayList是线程不安全的,那么在多线程中操作一个ArrayList对象,则会出现不确定的结果。具体是怎样不确定,请看测试下面这段代码(在此测试ArrayList的add方法):

执行几次会发现结果不一样,甚至有时会出现ArrayIndexOutOfBoundsException,贴出几次执行的结果:

结果一:

结果二:

结果三:

以上执行结果说明ArrayList确实是线程不安全的,然后我们从线程并发的角度分析,为何会出现这样的结果:

首先,我们先来看一下ArrayList中的add方法是如何实现的(查看详细源码请点击):


结果中,有的值没有出现(结果一中3没有出现),有的出现了null值,这是由于赋值时出现了覆盖。赋值语句为:elementData[size++] = e,这条语句可拆分为两条:
1. elementData[size] = e;
2. size ++;
假设A线程执行完第一条语句时,CPU暂停执行A线程转而去执行B线程,此时ArrayList的size并没有加一,这时在ArrayList中B线程就会覆盖掉A线程赋的值,而此时,A线程和B线程先后执行size++,便会出现值为null的情况;至于结果三中出现的ArrayIndexOutOfBoundsException异常,
则是A线程在执行ensureCapacity(size+1)后没有继续执行,此时恰好minCapacity等于oldCapacity,B线程再去执行,同样由于minCapacity等于oldCapacity,ArrayList并没有增加长度,B线程可以继续执行赋值(elementData[size] = e)并size ++也执行了,此时,CPU又去执行A线程的赋值操作,由于size值加了1,size值大于了ArrayList的最大长度,
因此便出现了ArrayIndexOutOfBoundsException异常。

既然ArrayList是线程不安全的,但如果需要在多线程中使用,可以采用list<Object> list =Collections.synchronizedList(new ArrayList<Object>)来创建一个ArrayList对象。

版权声明:本文为原创文章,转载请注明出处。

相关文章推荐

解决ArrayList线程不安全

前些天做项目时,程序出现意外的问题,经后来分析是使用ArrayList这个线程不安全的方法导致 解决这个问题通常有两种方法(个人认为) 一:使用synchronized关键字,这个大家应该都很熟悉...

为什么说ArrayList是线程不安全的?

首先说一下什么是线程不安全:线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。...

ArrayList线程不安全分析

分析ArrayList的线程不安全因素,不对之处欢迎大家指正

为什么说ArrayList是线程不安全的?

一个 ArrayList ,在添加一个元素的时候,它可能会有两步来完成: 1. 在 Items[Size] 的位置存放此元素; 2. 增大 Size 的值。   在单线程运行的情况下,如果 Si...

ArrayList源码剖析

注:本文转自:http://blog.csdn.net/ns_code/article/details/35568011ArrayList简介 ArrayList是基于数组实现的,是一个动态...

java 多线程同时操作ArrayList 出现ConcurrentModificationException 解决办法

尊重原创,原文转载地址:http://www.2cto.com/kf/201403/286536.html#SOHUCS     一、单线程 1. 异常情况举例 只要抛出出现异常,可以肯定的...

在JAVA中ArrayList如何保证线程安全

保证线程安全的三种方法: 不要跨线程访问共享变量 使共享变量是final类型的 将共享变量的操作加上同步 一开始就将类设计成线程安全的, 比在后期重新修复它,更容易. 编写多线程程序, 首先保证它...

ArrayList在添加元素的时候会出现的一些线程不安全的现象

再学习多线程编程的时候,看到如下代码。 package com.cbf4life; import java.util.*; public class ThreadSafeDemo { ...

懒汉式单例设计模式线程不安全

懒汉式:延迟加载方式。(先不new,等用到的时候再进行实例化)单例设计模式点击查看 [java] view plain copy   class single2{       &...

multithreading--线程不安全的案例,及其采用synchronized的解决办法

一:一个线程不安全的情况举例 public class J_xianchenganqaun { /**多线程不可控因素:1,线程调度将时间片段分配给哪个线程;2,时间片段的具体时间。 * @p...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)