前言:为什么底层使用CAS而不是sychronized?
首先需要了解的是,Java中只对基本类型的变量的赋值和读取是原子操作,如 i=1 这样的是原子操作,j=i,j++都不是原子操作,因为他们都进行了多次原子操作,那么AtomicInteger 就应运而生了,它是一个原子类,可以解决我们在多线程环境下 i++的线程安全问题。那既然是解决线程安全问题的,那为什么不用sychronized呢,而是使用CAS呢?带着这个问题,我们开始接下来的源码分析:
剖析:
一、使用以及原理
1、我们先抛出一个线程不安全的例子:结果:13400
public class UnsafeInt {
static int number=0;
public static void main(String[] args) throws Exception{
Runnable runnable=new Runnable(){
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
number=number+1;
}
}
};
Thread t1=new Thread(runnable);
t1.start();
Thread t2=new Thread(runnable);
t2.start();
t1.join();
t2.join();
System.out.println("number:"+number);
}
}
2、那AtomicInteger是如何解决这个问题的呢?拥有这个API你就行
/**
* Atomically increments by one the current value.
*
* @return the previous value
*/
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, va