ArraysList是线程不安全的数据类型。如果多个线程同时访问列表实例,并且至少有一个线程在结构上修改列表,则需要在外部同步。使用Collections.sychronizedList方法是线程安全的。

查看JDK文档,在结构上修改ArraysList的方法有



分析源码发现,在add方法中的elementData[size++] = e;存在线程不安全的风险。

elementData与size都是全局变量,但没有进行sychronization同步处理,elementData是共享的线程不安全的mutable可变数据。

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable{private static final long serialVersionUID = 8683452581122892189L;

private static final int DEFAULT_CAPACITY = 10;

private static final Object[] EMPTY_ELEMENTDATA = {};

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

transient Object[] elementData; // non-private to simplify nested class access

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

public void add(int index, E element) {        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!        System.arraycopy(elementData, index, elementData, index + 1,                         size - index);        elementData[index] = element;        size++;    }}复制代码

在iterator部分存在线程不安全的风险,原因之一是iterator部分直接使用了ArraysList的add方法ArrayList.this.add(i, e); ,但没有进行sychronization同步处理。

   public ListIteratorlistIterator(int index) {if (index < 0 || index > size)throw new IndexOutOfBoundsException("Index: "+index);return new ListItr(index);    }public ListIteratorlistIterator() {return new ListItr(0);    }public Iteratoriterator() {return new Itr();    }/**     * An optimized version of AbstractList.Itr     */private class Itr implements Iterator<E> {      .......................    }/**     * An optimized version of AbstractList.ListItr     */private class ListItr extends Itr implements ListIterator<E> {        ........................public void set(E e) {if (lastRet < 0)throw new IllegalStateException();            checkForComodification();try {                ArrayList.this.set(lastRet, e);            } catch (IndexOutOfBoundsException ex) {throw new ConcurrentModificationException();            }        }public void add(E e) {            checkForComodification();try {int i = cursor;                ArrayList.this.add(i, e);                cursor = i + 1;                lastRet = -1;                expectedModCount = modCount;            } catch (IndexOutOfBoundsException ex) {throw new ConcurrentModificationException();            }        }    }复制代码

总结

本文通过add和Iterator入手分析ArraysList线程不安全的原因,可能不够全面,欢迎补充,欢迎指正!

·SHARE·

某985工科男,某互联网大厂搬砖工,有一点温度,也有一点理性;有一点有趣,也有一点认真。写一些心得,偶尔也分享一些资源

微信号:程序猿的进阶

simpledateformat线程不安全_ArrayList为什么线程不安全?相关推荐

  1. 并发编程-12线程安全策略之常见的线程不安全类

    文章目录 脑图 概述 字符串拼接子之StringBuilder.StringBuffer StringBuilder (线程不安全) StringBuffer (线程安全) 小结 时间相关的类 Sim ...

  2. java timer 线程安全_多线程之 线程安全与控制

    线程控制 wait和notify方法需要注意的细节:wait方法与notify方法必须要由同一个锁对象调用.因为:对应的锁对象可以通过notify唤醒使用同一个锁对 象调用的wait方法后的线程. w ...

  3. boost创建线程池_Java并发 之 线程池系列 (1) 让多线程不再坑爹的线程池

    目录 背景 线程池的来由 什么是线程池 背景总结 用法 通过Executors创建线程池 Executors及其服务的类 Executors常用的几个方法 一个线程池的例子 任务 池子 测试 说明 总 ...

  4. 线程并发库和线程池的作用_线程和并发介绍

    线程并发库和线程池的作用 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如 ...

  5. 线程状态,优先级,守护线程基础详解

    线程状态,优先级,守护线程基础详解 线程状态 停止线程 线程休眠 线程礼让 线程强制执行 线程状态检测 线程的优先级 守护线程 线程同步 线程状态 创建状态(new 之后就是创建状态 就绪状态(调用s ...

  6. java线程池存在时间_Java线程池基础

    目录: 一.线程池概述 1.线程池类 目前线程池类一般有两个,一个来自于Spring,一个来自于JDK: 来自Spring的线程池:org.springframework.scheduling.con ...

  7. java 线程 通过interrupted_Java线程的传说(1)——中断线程Interrupted的用处

    中断线程 -- interrupt() 一个正在运行的线程除了正常的时间片中断之外,能否被其他线程控制?或者说其他线程能否让指定线程放弃CPU或者提前结束运行? 除了线程同步机制之外,还有两种方法: ...

  8. Java线程怎样映射到操作系统线程

    先说多线程模型,参考经典教材<Operating System Concepts , Silberschatz ,9th edition> 中文版是<操作系统概念,第9版> h ...

  9. springboot 线程池_Spring boot 2 线程池怎么配置

    线程池 在java 中线程池,就是ThreadPoolExecutor来构造,简单看下线程池包含的方法, corePoolSize:初始化线程.线程池中保留的线程数量. maximumPoolSize ...

最新文章

  1. 海量秋招面试资料等你来拿!你离大厂也许并不远
  2. 【面试宝典】:《深度学习面试指南》重磅开源!
  3. [你必须知道的css系列]第一回:丰富的利器2:CSS选择符之子选择符、相邻选择符...
  4. UVa1467 Installations(贪心)
  5. javascript对象、类与原型链
  6. Python——web.py模块错误【UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xab in position 285】解决方案
  7. 副业刚需? 恐怕并不靠谱!
  8. FreeSWITCH安装报错“You must install libyuv-dev to build mod_fsv”的解决方案
  9. 云计算管理工具:根植热土
  10. 在chrome-console中进行xpath/css/js定位
  11. Android 系统(132)---ODM 开发用户常见需求文档(六)
  12. C# Rotating Oval
  13. codable swift_使用Codable进行Swift JSON解析
  14. java打印特殊符号_Java Poi 在Excel中输出特殊符号的实现方法
  15. 1小时搞懂 Git 版本控制
  16. 视频直播app和网页版怎么开发?
  17. 我如何在GitHub Project上获得1,000个星星,以及在此过程中学到的教训
  18. H5培训第一天基础知识总结
  19. windows安装pscp工具,通过命令行上传到linux服务器
  20. 计算dpi公式及各主流分辨率介绍

热门文章

  1. 在线求CR,你觉得我这段Java代码还有优化的空间吗?
  2. H哥被阿里技术的小姐姐采访了,聊了这些东西。
  3. JeecgBoot 单体升级微服务快速方案(十分钟搞定)
  4. 开源协议神图介绍 MIT 与 Apache 等
  5. UI标签库专题二:JEECG智能开发平台Column(列) 子标签
  6. javamail发送邮件的简单实例
  7. 架构组件:基于shard-jdbc中间件,实现数据分库分表
  8. CImg库【C++】
  9. Spring安装与入门
  10. Android Studio 导入 AOSP 源码