Atomic工具类:
1、原子类工具包(线程安全):
Java.util.concurrent.atomic
2、无锁技术的底层实现原理:
- Unsafe Api - CompareAndSwap
- CPU硬件指令支持 - CAS指令
- Value的可见性 - volatile 关键字
核心实现原理:
- volatile保证读写操作的可见性(注意不保证原子性)
- 使用CAS指令,作为乐观锁实现,通过自旋重试保证写入
3、思考,到底是有锁好,还是无锁好?
- CAS本质没有使用锁
- 并发压力跟锁性能的关系:
- 压力非常小,性能本身要求就不高。
- 压力一般的情况下,要求性能,无锁更快,因为大部分都一次写入
- 压力过大时,推荐使用锁,因为CAS导致重试过多,资源消耗很大。
4、LongAdder对Atomic的改进:
通过分段思想(多路归并)改进原子类。
其他用到该思想:
- 快排
- G1 GC
- ConcurrentHashMap
LongAdder的改进思路:
- AtomicInteger和AtomicLong里的value是所有线程竞争读写的热点数据。
- 将单个value拆分成跟线程一样多的数组Cell[];
- 每个数组写自己的Cell[i]++,最后对数组求和。