Atomic原子类,可能你没有用过,但你肯定知道,在多线程环境下i++这种的操作是无法保证结果的原子性的,如果使用Atomic原子类来递增的话,则不会有问题
Atomic原子类底层使用的就是CAS(compare and swap),这是一种无锁化的机制,比起synchronized关键字的加锁,CAS的效率要高上不少
简单来说,CAS其实就先将要修改的变量原值读出来,然后修改,最后再比较一下当前变量的值是不是跟第一次读取出来是一样的,如果是一样的话,那么就说明没有人改过,就修改变量;如果变了,那么说明变量已经被其他人修改了,再次重复这个操作,直到修改成功
CAS虽然效率很高,但也存在一些缺点的:
1、多变量原子问题:类似AtomicInteger、AtomicLong、AtomicBoolean这些Atomic都是对基本数据类型进行CAS操作,如果我们需要对多个变量保证原子性呢?
那么就需要使用AtomicReference,多个变量可以封装为一个自定义对象,使用AtomicReference的话就可以比较对象的引用是不是同一个,保证多个变量的原子性
2、经典的ABA问题:可能存在这么一种情况,变量当前值是A,这时线程1执行一次CAS操作,读出了这个变量的原值是A,然后线程2将变量的值改为了B,此时又来了一个线程3将变量的值从B又改为了A,最后线程1执行完了变量的修改,发现此时变量的值还是A,所以CAS操作成功了。但是变量经历了A -> B ->A这个过程,可能就会出现一些问题。
Atomic原子类中的