如何使ArrayList 线程安全?

一、关于线程安全
1 . 使用关键字同步
具体操作就是给方法或者代码块加锁,比如synchronized(this) { ... }
举个例子,假设你在北京时间2 02 0年写了代码: 爪哇 公共同步无效addData(字符串数据){ this.data.add(数据); }


2 . FromCollections.synchronizedList()
原因是ArrayList本身不安全,就像你在2 02 1 年上海遇到的情况一样,多个线程同时往里面加数据就出问题
用法是这样的: 爪哇 列表<映射<字符串,对象>>数据= Collections.synchronizedList(new ArrayList>());
其实就是Collections帮我们自动加锁了,最简单跟普通ArrayList差不多
但要注意,辅助操作需手动加锁,例如: 爪哇 同步(数据){ 数据.add(newMap); }
ArrayList和LinkedList的区别

两者都实现List接口,用法类似
ArrayList适合随机访问,比如get(1 00),2 02 2 年在深圳测试的时候发现,ArrayList比LinkedList快1 00倍
LinkedList适合频繁的插入和删除,比如链表表头操作。

两者默认都不安全,解决方法同上
性能损失确实很大,尤其是高并发场景,就像你2 02 3 年遇到的项目,线程数超过2 0就会阻塞
2 .LinkedList自定义同步
1 .定义类: 爪哇 公共类 MyLinkedList 扩展 LinkedList { 公共同步无效addFirst(对象e){ super.addFirst(e); } 空同步公共removeLast(){ super.removeLast(); } }
2 使用方法: 爪哇 列表 MyLinkedList = new MyLinkedList(); 列表 listProxy = Collections.synchronizedList(list);
3 像这样使用它:
直接使用listProxy方法,如listProxy.addFirst()
或者同步所有内容,就像您在 2 02 3 年重构时所做的那样
关键是要明白synchronized修改的是整个方法,而不是局部代码块
可以肯定的是,同步操作确实很慢,但有时需要使用它们。
您在 2 02 2 年对其进行了测试。
无阻塞版本每秒可以处理 2 ,000 个操作,但在阻塞情况下,只剩下 5 00 个操作。

Java Collections.synchronizedList如何保证线程安全

这是一个陷阱。
在复合操作和迭代期间不要依赖 Collections.synchronizedList 的线程安全性。
在高并发场景下性能会很差。