jdk源码学习之JUC总结(3)

一、并发集合

1.ConcurrentHashMap

jdk1.7中的ConcurrentHashMap使用了分段锁来保证线程安全,就是把HashMap分成几段,然后对每一段数据加锁后再进行数据操作。
而jdk1.8之后是使用synchronize对每一个数据加锁。
两者的区别在于分段锁的并发量不如synchronize,适用于并发量小的场景。

2.ConcurrentLinkedQuene

线程安全的队列,底层使用CAS和单链表。

3.CopyOnWriteArrayList

线程安全的List,底层使用ReentrantLock和数组。读写分离,读时不加锁,写数据时复制到新数组,再指向新数组,这个过程需要加锁。

二、原子类和锁

1.常见的原子类和使用场景

java.util.atomic包里面是常见的原子类,原子类使用CAS保证了一些基本数据类型的常见操作的线程安全,比如修改值,自增等操作。

2.ReentrantLock

ReentrantLock是实现线程同步常用的锁,基于AQS。和synchronize相比,ReentrantLock可重入,可实现公平锁,在多线程竞争激烈的情况下性能优于synchronize。

3.ReadWriteLock

在读线程多于写线程的时候,读写锁的性能优于普通锁。因为读写锁的读锁可以有多个线程同时获得并进行读操作,而写锁只能有一个线程获得。

三、其他并发工具类

1.ThreadLLocal

ThreadLLocal提供了另一种解决线程同步问题的思路,它保存了同步变量的多个副本,并且和线程对应起来,这样每个线程就拥有了独立的变量而不会相互影响。