首页 > 其他 > 详细

源码底层

时间:2020-03-14 15:08:49      阅读:34      评论:0      收藏:0      [点我收藏+]

Vrctor源码

 

技术分享图片

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

技术分享图片

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

技术分享图片

 

 

 

 

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

ArrayList源码

技术分享图片

 

 

Collections.synchronizedList();

技术分享图片

 

 

CopyOnWriteArrayList<>().add

 

技术分享图片

 

 

 

LinkedList源码

技术分享图片

 

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 技术分享图片

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

总结:

1.单列集合List

1.1 Vector和ArrayList以及LinkedList区别和联系,以及分别的应用场景 线程安全:
Vector:如果创建Vector时没有指定容量,则默认容量为10,底层基于数组实现,线程是安全的,底层采用synchronized同步方法进行加锁
ArrayList:底层基于数组,线程不安全,查询和修改效率高,但是增加和删除效率低
LinkedList:底层双向链表结构,线程不安全,查询和修改效率低,但是增加和删除效率高

使用场景:
1.Vector很少用
2.如果需要大量的添加和删除则可以选择LinkedList
3.如果需要大量的查询和修改则可以选择ArrayList

 

1.2 如果要保证ArraList线程安全,有几种方式?

1.2.1 自己表写一个ArrayList集合类,根据业务一般来说,add/set/remove加锁
1.2.2 利用List<Object> list = Collections.synchronizedList(new ArrayList<>()); //采用synchronized加锁
1.2.3 new CopyOnWriteArrayList<>().add(""); //采用 ReentrantLock加锁

1.3 了解CopyOnWriteArrayList底层?,CopyOnWriteArrayList与Collections.synchronizedList有什么区别
1.3.1 CopyOnWriteArrayList底层实现:
CopyOnWriteArrayList在执行修改操作的时候,会复制一份新的数组数据,代价昂贵,修改过后将原来的集合指向到新的集合完成操作
使用ReentrantLock保证多线程环境下的集合安全

public boolean add(E e) {
final ReentrantLock lock = this.lock; //获取了一把锁
lock.lock(); //加锁
try {
Object[] elements = getArray(); //获取当前数组数据,给elements
int len = elements.length; //记录当前数组的长度
Object[] newElements = Arrays.copyOf(elements, len + 1); //复制一个新的数组
newElements[len] = e; //将数据填入到新数组当中
setArray(newElements); //将当前array指针指向到新的数据
return true;
} finally {
lock.unlock(); //释放锁
}
}
CopyOnWriteArrayList应用场景:适用于读取操作远大于写操作场景(底层get读取时没有加锁,直接获取)


1.3.2 Collections.synchronizedList几乎底层方法都加上了synchronized的锁

 

场景:写操作的性能比CopyOnWriteArrayList要好,但是读取的性能不如CopyOnWriteArrayList


1.4 CopyOnWriteArrayList设计思想是怎么样的,有什么缺点?

设计思想:读写分离,最终一致
缺点:内存占用,由于写时复制,内存中就会出现两个对象占用空间,如果对象大则容易发生YongGC和FullGC

 

源码底层

原文:https://www.cnblogs.com/ringqq/p/12492148.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!