当前位置:网站首页>ArrayList线程不安全和解决方案
ArrayList线程不安全和解决方案
2022-07-07 08:23:00 【HGW689】
我们通常说的Java中的fail-fast机制(快速失败机制),默认指的是Java集合中的一种错误检测机制,当多个线程对集合进行结构性的改变时,有可能会出发fail-fast机制,这个时候会抛出ConcurrentModificationException异常。
为什么ArrayList线程不安全?Vector却线程安全呢?让我们来一探究竟!
ArrayList:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
//ensureCapacityInternal()就是判断如果将当前的新元素加到列表后面,列表的elementData数组的大小是否满足,如果size + 1的这个需求长度大于了elementData这个数组的长度,那么就要对这个数组进行扩容
elementData[size++] = e;
return true;
}
Vector:
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
显而易见:在ArrayList中,elementData与size都是全局变量,但没有进行sychronization同步处理,elementData是共享的线程不安全的mutable可变数据。
那么如何解决LIst线程安全问题呢?
- Vector:Vector list = new Vector<>();
- Collections:List list = Collections.synchronizedList(new ArrayList());
- CopyOnWriteArrayList:List list = new CopyOnWriteArrayList<>();
我们来看看 CopyOnWriteArrayList 中的add()方法,原理是使用了 写时复制技术:
public boolean add(E e) {
final ReentrantLock lock = this.lock;
// 首先:加锁!
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
// 1、将内容复制了一份
Object[] newElements = Arrays.copyOf(elements, len + 1);
// 2、写入新的内容
newElements[len] = e;
// 3、合并
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
边栏推荐
- 字符串格式化
- ThreadLocal会用可不够
- How to cancel automatic saving of changes in sqlyog database
- Using U2 net deep network to realize -- certificate photo generation program
- Weekly recommended short videos: what are the functions of L2 that we often use in daily life?
- Leetcode-304: two dimensional area and retrieval - matrix immutable
- Postman interface test VI
- 电表远程抄表拉合闸操作命令指令
- STM32 product introduction
- The mobile terminal automatically adjusts the page content and font size by setting rem
猜你喜欢
mysql插入数据创建触发器填充uuid字段值
Vs code specifies the extension installation location
MySQL insert data create trigger fill UUID field value
High number_ Chapter 1 space analytic geometry and vector algebra_ Quantity product of vectors
How to cancel automatic saving of changes in sqlyog database
OpenGL glLightfv 函数的应用以及光源的相关知识
Yarn的基础介绍以及job的提交流程
【二开】【JeecgBoot】修改分页参数
Weekly recommended short videos: what are the functions of L2 that we often use in daily life?
Postman interface test VI
随机推荐
leetcode-303:区域和检索 - 数组不可变
Appx代码签名指南
P1223 排队接水/1319:【例6.1】排队接水
【acwing】786. 第k个数
LLVM之父Chris Lattner:为什么我们要重建AI基础设施软件
Programming features of ISP, IAP, ICP, JTAG and SWD
BigDecimal数值比较
Guid主键
【二开】【JeecgBoot】修改分页参数
2022.7.5DAY597
BigDecimal value comparison
01 use function to approximate cosine function (15 points)
Review of the losers in the postgraduate entrance examination
Smart city construction based on GIS 3D visualization technology
施努卡:机器视觉定位技术 机器视觉定位原理
Study summary of postgraduate entrance examination in November
The story of Plato and his three disciples: how to find happiness? How to find the ideal partner?
Socket通信原理和实践
IIC基本知识
C logging method