simpledateformat线程不安全_ArrayList为什么线程不安全?
查看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为什么线程不安全?相关推荐
- 并发编程-12线程安全策略之常见的线程不安全类
文章目录 脑图 概述 字符串拼接子之StringBuilder.StringBuffer StringBuilder (线程不安全) StringBuffer (线程安全) 小结 时间相关的类 Sim ...
- java timer 线程安全_多线程之 线程安全与控制
线程控制 wait和notify方法需要注意的细节:wait方法与notify方法必须要由同一个锁对象调用.因为:对应的锁对象可以通过notify唤醒使用同一个锁对 象调用的wait方法后的线程. w ...
- boost创建线程池_Java并发 之 线程池系列 (1) 让多线程不再坑爹的线程池
目录 背景 线程池的来由 什么是线程池 背景总结 用法 通过Executors创建线程池 Executors及其服务的类 Executors常用的几个方法 一个线程池的例子 任务 池子 测试 说明 总 ...
- 线程并发库和线程池的作用_线程和并发介绍
线程并发库和线程池的作用 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如 ...
- 线程状态,优先级,守护线程基础详解
线程状态,优先级,守护线程基础详解 线程状态 停止线程 线程休眠 线程礼让 线程强制执行 线程状态检测 线程的优先级 守护线程 线程同步 线程状态 创建状态(new 之后就是创建状态 就绪状态(调用s ...
- java线程池存在时间_Java线程池基础
目录: 一.线程池概述 1.线程池类 目前线程池类一般有两个,一个来自于Spring,一个来自于JDK: 来自Spring的线程池:org.springframework.scheduling.con ...
- java 线程 通过interrupted_Java线程的传说(1)——中断线程Interrupted的用处
中断线程 -- interrupt() 一个正在运行的线程除了正常的时间片中断之外,能否被其他线程控制?或者说其他线程能否让指定线程放弃CPU或者提前结束运行? 除了线程同步机制之外,还有两种方法: ...
- Java线程怎样映射到操作系统线程
先说多线程模型,参考经典教材<Operating System Concepts , Silberschatz ,9th edition> 中文版是<操作系统概念,第9版> h ...
- springboot 线程池_Spring boot 2 线程池怎么配置
线程池 在java 中线程池,就是ThreadPoolExecutor来构造,简单看下线程池包含的方法, corePoolSize:初始化线程.线程池中保留的线程数量. maximumPoolSize ...
最新文章
- 海量秋招面试资料等你来拿!你离大厂也许并不远
- 【面试宝典】:《深度学习面试指南》重磅开源!
- [你必须知道的css系列]第一回:丰富的利器2:CSS选择符之子选择符、相邻选择符...
- UVa1467 Installations(贪心)
- javascript对象、类与原型链
- Python——web.py模块错误【UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xab in position 285】解决方案
- 副业刚需? 恐怕并不靠谱!
- FreeSWITCH安装报错“You must install libyuv-dev to build mod_fsv”的解决方案
- 云计算管理工具:根植热土
- 在chrome-console中进行xpath/css/js定位
- Android 系统(132)---ODM 开发用户常见需求文档(六)
- C# Rotating Oval
- codable swift_使用Codable进行Swift JSON解析
- java打印特殊符号_Java Poi 在Excel中输出特殊符号的实现方法
- 1小时搞懂 Git 版本控制
- 视频直播app和网页版怎么开发?
- 我如何在GitHub Project上获得1,000个星星,以及在此过程中学到的教训
- H5培训第一天基础知识总结
- windows安装pscp工具,通过命令行上传到linux服务器
- 计算dpi公式及各主流分辨率介绍