AtomicInteger源代码分析

原理

AtomicInteger的本质:自旋锁+CAS原子操作

 

源代码:

初始化

AtomicInteger源代码分析

 

使用Unsafe类,定义偏移量 valueOffset,类加载就初始化。用于原子操作CAS

本质

Valatile私有,并且用volatile修饰

AtomicInteger源代码分析

 

 

 

 

 

Jdk1.7和1.8实现不一样

Jdk1.7及以前

AtomicInteger源代码分析

 

1.获取volatitle修饰的变量,最新的主存值

2.value+1作为自增值

3. compare value是否就是主存值,是,set nextreturn next;否,循环下一次

JDK1.8及以后

AtomicInteger源代码分析

 

优缺点

AtomicInteger的优点

1.乐观锁,性能较强,利用CPU自身的特性保证原子性,即CPU的指令集封装compare and swap两个操作为一个指令来保证原子性。

2.适合读多写少模式

AtomicInteger的缺点

1.自旋,消耗CPU性能,所以写的操作较多推荐synchronized

2.仅适合简单的运算,否则会产生ABA问题,自旋的时候,别的线程可能更改value,然后又改回来,此时需要加版本号解决,JDK提供了AtomicStampedReferenceAtomicMarkableReference解决ABA问题,提供基本数据类型和引用数据类型版本号支持