当前位置:网站首页>面试官问线程安全的List,看完再也不怕了!
面试官问线程安全的List,看完再也不怕了!
2022-07-27 21:04:00 【十一技术斩】
既然 ArrayList 是线程不安全的,怎么保证它的线程安全性呢?或者有什么替代方案?
往下看,看我如何碾压他!
大部分人会脱口而出:用Vector,这样只会让面试官鄙视!除了Vector,你还会别的吗?
你至少还得说得上这种:
java.util.Collections.SynchronizedList
它能把所有 List 接口的实现类转换成线程安全的List,比 Vector 有更好的扩展性和兼容性,SynchronizedList的构造方法如下:
final List<E> list;
SynchronizedList(List<E> list) {
super(list);
this.list = list;
}
SynchronizedList的部分方法源码如下:
public E get(int index) {
synchronized (mutex) {return list.get(index);}
}
public E set(int index, E element) {
synchronized (mutex) {return list.set(index, element);}
}
public void add(int index, E element) {
synchronized (mutex) {list.add(index, element);}
}
public E remove(int index) {
synchronized (mutex) {return list.remove(index);}
}
很可惜,它所有方法都是带同步对象锁的,和 Vector 一样,它不是性能最优的。即使你能说到这里,面试官还会继续往下追问,比如在读多写少的情况,SynchronizedList这种集合性能非常差,还有没有更合适的方案?
介绍两个并发包里面的并发集合类:
java.util.concurrent.CopyOnWriteArrayList
java.util.concurrent.CopyOnWriteArraySet
CopyOnWrite集合类也就这两个,Java 1.5 开始加入,你要能说得上这两个才能让面试官信服。
CopyOnWriteArrayList
CopyOnWrite(简称:COW):即复制再写入,就是在添加元素的时候,先把原 List 列表复制一份,再添加新的元素。
先来看下它的 add 方法源码:
public boolean add(E e) {
// 加锁
final ReentrantLock lock = this.lock;
lock.lock();
try {
// 获取原始集合
Object[] elements = getArray();
int len = elements.length;
// 复制一个新集合
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
// 替换原始集合为新集合
setArray(newElements);
return true;
} finally {
// 释放锁
lock.unlock();
}
}
添加元素时,先加锁,再进行复制替换操作,最后再释放锁。
再来看下它的 get 方法源码:
private E get(Object[] a, int index) {
return (E) a[index];
}
public E get(int index) {
return get(getArray(), index);
}
可以看到,获取元素并没有加锁。
这样做的好处是,在高并发情况下,读取元素时就不用加锁,写数据时才加锁,大大提升了读取性能。
CopyOnWriteArraySet
CopyOnWriteArraySet逻辑就更简单了,就是使用 CopyOnWriteArrayList 的 addIfAbsent 方法来去重的,添加元素的时候判断对象是否已经存在,不存在才添加进集合。
/**
* Appends the element, if not present.
*
* @param e element to be added to this list, if absent
* @return {@code true} if the element was added
*/
public boolean addIfAbsent(E e) {
Object[] snapshot = getArray();
return indexOf(e, snapshot, 0, snapshot.length) >= 0 ? false :
addIfAbsent(e, snapshot);
}
这两种并发集合,虽然牛逼,但只适合于读多写少的情况,如果写多读少,使用这个就没意义了,因为每次写操作都要进行集合内存复制,性能开销很大,如果集合较大,很容易造成内存溢出。
总结
下次面试官问你线程安全的 List,你可以从 Vector > SynchronizedList > CopyOnWriteArrayList 这样的顺序依次说上来,这样才有带入感,也能体现你对知识点的掌握程度。
看完有没有收获呢?下次面试应该能秒杀面试官了吧!

边栏推荐
- 数据管理的重点
- 四次挥手的Socket交互流程
- Winform怎么使用FTP实现自动更新
- CaEGCN: Cross-Attention Fusion based Enhanced Graph Convolutional Network for Clustering 2021
- 【JS 逆向百例】某公共资源交易网,公告 URL 参数逆向分析
- Date的使用
- 真的很难理解?RecyclerView 缓存机制到底是几级缓存?
- [number recognition] recognize 0-9 numbers based on Hopfield neural network with matlab code
- 【C语言】通讯录(动态版本)
- Technical certification | Tupo software and Huawei cloud create a new situation of win-win cooperation
猜你喜欢

C#委托用法--控制台项目,通过委托实现事件

华为鸿蒙 3 正式发布,这个安全功能解决了一大痛点

Introduction to several common usage scenarios of message queue

置信区间之正态
![[JS reverse hundred examples] a public resource trading network, reverse analysis of announcement URL parameters](/img/05/7029eb1fe36d7ddab2640f07247c81.png)
[JS reverse hundred examples] a public resource trading network, reverse analysis of announcement URL parameters

他山之石 | 蚂蚁超大规模知识图谱构建及应用

Remotely debug idea, configure remote debug, and add JVM startup parameter -xdebug in the program of remote server
![[C language] address book (dynamic version)](/img/29/3df19c187bee31ee4671e12d7cc7ff.jpg)
[C language] address book (dynamic version)

低代码开发前景如何,大家都真的看好低代码开发吗?

Nature综述:微生物群落形成过程中的优先效应
随机推荐
[JS reverse hundred examples] a public resource trading network, reverse analysis of announcement URL parameters
NDK 系列(6):说一下注册 JNI 函数的方式和时机
Solve 5g pain points, Meizu 17 smart 5g fast and stable technology release
2019年全球十大半导体厂商:英特尔重回第一,苹果逆势大涨
携手长江存储,江波龙推出全球最小扩展卡
The total investment is 60billion! Foxconn semiconductor high-end package test project officially settled in Qingdao
What are the methods of process synchronization?
三次握手的Socket交互流程
This is the most concise guide to tcpdump in history. It's enough to read this one
Explain the idempotence of distributed system in detail
MySQL之数据查询(WHERE)
How to use xshell Free Edition
Zabbix4.0 uses SNMP agent to monitor vcenter6.5
In 2019, the world's top ten semiconductor manufacturers: Intel returned to the first place, and apple rose sharply against the trend
Normality of confidence interval
File & recursion 14.1
台积电3nm细节曝光:晶体管密度高达2.5亿个/mm²,性能及能效大幅提升
Technical certification | Tupo software and Huawei cloud create a new situation of win-win cooperation
CaEGCN: Cross-Attention Fusion based Enhanced Graph Convolutional Network for Clustering 2021
新技术引领大中型企业营销新变革,用友BIP CRM重磅发布!