AtomicInteger是java1.5中java.util.concurrent.atomic下的一个类。
为什么要引入AtomicInteger
java中一般的运算符操作在多线程下是不安全的,例如i=1+1这个操纵在多线程的场景下是不安全的。假如一个线程计算完了1+1但是还并未对i进行赋值,此时另外一个线程来读取i的值,读取到的就是i之前的值,此时就出现了问题。虽然可以通过加锁的方式来避免这个问题但是加锁会极大的浪费性能,因此在java1.5引入了AtomicInteger解决这个问题。
AtomicInteger的引入解决了在不加锁的情况下也可以保证线程的安全
AtomicInteger的常用方法
addAndGet()- 以原子方式将给定值添加到当前值,并在添加后返回新值。
getAndAdd() - 以原子方式将给定值添加到当前值并返回旧值。
incrementAndGet()- 以原子方式将当前值递增1并在递增后返回新值。它相当于i ++操作。
getAndIncrement() - 以原子方式递增当前值并返回旧值。它相当于++ i 操作。
decrementAndGet()- 原子地将当前值减1并在减量后返回新值。它等同于i-- 操作。
getAndDecrement() - 以原子方式递减当前值并返回旧值。它相当于-- i 操作。
AtomicInteger的底层实现
AtmoicInteger在底层的实现是通过CAS(乐观锁)来进行实现的。
CAS乐观锁:认为每次取数据得时候都认为别的线程不会正在修改,所以不加锁,写数据的时候判断当前值与期望值是否相等,一样则更新,否则继续进行CAS操作。