AtomicInteger源代码分析
原理
AtomicInteger的本质:自旋锁+CAS原子操作
源代码:
初始化
使用Unsafe类,定义偏移量 valueOffset,类加载就初始化。用于原子操作CAS。
本质
Valatile私有,并且用volatile修饰
Jdk1.7和1.8实现不一样
Jdk1.7及以前
1.获取volatitle修饰的变量,最新的主存值
2.value+1作为自增值
3. compare value是否就是主存值,是,set next,return next;否,循环下一次
JDK1.8及以后
优缺点
AtomicInteger的优点
1.乐观锁,性能较强,利用CPU自身的特性保证原子性,即CPU的指令集封装compare and swap两个操作为一个指令来保证原子性。
2.适合读多写少模式
AtomicInteger的缺点
1.自旋,消耗CPU性能,所以写的操作较多推荐synchronized
2.仅适合简单的运算,否则会产生ABA问题,自旋的时候,别的线程可能更改value,然后又改回来,此时需要加版本号解决,JDK提供了AtomicStampedReference和AtomicMarkableReference解决ABA问题,提供基本数据类型和引用数据类型版本号支持