原子更新基本类型类是什么
原子更新基本类型类就是在保证原子性的前提下更新基本类型的值,Atomic包提供了以下三个类。
1.AtomicBoolean:原子更新布尔类型
2.AtomicInteger:原子更新整型
3.AtomicLong:原子更新长整型
就拿AtomicInteger举例,这个方法的作用就是把操作对象原先的值做一个++的操作,但是众所周知,i++这种操作他是不保证原子性的,那AtomiceInteger是怎么保证的,先来看看AtomicInteger的常用用法:
1.int addAddGet(int delta):以原子方式将对象的值和参数中的值进行相加并返回结果。
2.Boolean compareAndSet(int expect,int update):这就是cas,比较并替换,当输入的数值等于预期值就用原子的方式将预期值设置为输入的值。
3.int getAndIncrement():以原子的方式将当前值+1,返回自增前的值。
那么这些方法是怎么保证原子性的呢,来看看源码:
public final int getAndIncrement() {
//这里的for(;;)是比while(true)的效率更高的,因为每次不用判断直接进入循环体
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
public final boolean compareAndSet(int expect,int update){
return unsafe.compareAndSwapInt(this,valueoffset,expect,update);
}
首先是一个死循环for(;;),然后对当前数值进行++操作,最后用cas来保证原子性,先检查当前数值是否等于current,如果等于那说明中间没有线程对该值进行了改变,直接将当前数值更新成++后的next的值(注意,这里有可能会发生ABA问题,但是我看了其他大佬的博客,发现原子类里有一个叫AtomicStampedReference的方法,该方法用版本号来保证不会有aba问题发生),如果当前数值不等于next,那么就会重新进入for循环进行下一次的更新操作。