从历史角度展开叙述的话至今集合已经经历三代
第一代默认集合已经全是线程安全
因为这一代全默认集合为线程安全,使用Synchronized修饰,所以导致了效率低下的问题。
而后jdk作者也就发现大多数情况下,集合不需要线程安全的
第二代线程非安全集合类
这一代诞生了HashMap,ArrayList等这些不需要线程安全的集合。
如果某些场景下需要这些集合线程安全,jdk作者也考虑到了,就是使用Collections.SynchronizedList(list)以及Collections.S ynchronizedMap(map)等方法锁住其代码,使其线程安全。
但是与第三代相比仍然有不灵活的问题
第三代线程安全集合类
主要使用CAS(实现自旋锁的基础),底层大多时间使用AQS。
【补充】
AQS全称为AbstractQueuedSynchronized,它是JUC包中Lock锁的底层实现,可以用AQS来实现多线程的同步器。
但是因为并发量太大,所以也出现了如何提高集合效率和安全的问题。
list集合使用JUC下的类去实现高并发情况下的集合安全
new CopyOnWriteArrayList<>();
set集合使用JUC下的类去实现高并发情况下的集合安全
new CopyOnWriteArraySet<>();
map集合使用使用JUC下的类去实现高并发情况下的集合安全
new ConcurrenthashMap<>();
(具体用法举例一个如Map<String , String > map = new ConcurrenthashMap<>();)