java-原子类
一、JUC包中原子类包括了哪四类
1、基本类型
1.1AtomicInteger:整形原子类
1.2AtomicLong:长整型原子类
1.3AtomicBoolean:布尔型原子类
2、数组类型
2.1AtomicIntegetArray:整形数组原子类
2.2AtomicLongArray:长整形数组原子类
2.3AtomicReferenceArray:引用类型数组原子类
3、引用类型
3.1AtomicReference:引用类型原子类
3.2AtomicStampedReference:原子更新带有版本号的应用类型,该类型将数值与引用关联起来,可用于解决原子的
更新数据和版本号,可以解决使用CAS进行原子更新时可能出现的ABA问题。
3,3AtomicMarkableReference:原子更新带有标记为的引用类型。
4、对象的属性修改类型
4.1AtomicReferenceFieldUpdater:原子更新应用类型字段的更新器
三、AtomicInteger的使用
AtomicInteger类常用方法
public final int get() //获取当前的值 public final int getAndSet(int newValue)//获取当前的值,并设置新的值 public final int getAndIncrement()//获取当前的值,并自增 public final int getAndDecrement() //获取当前的值,并自减 public final int getAndAdd(int delta) //获取当前的值,并加上预期的值 boolean compareAndSet(int expect, int update) //如果输入的数值等于预期值,则以原子方式将该值设置为输入值(update) public final void lazySet(int newValue)//最终设置为newValue,使用 lazySet 设置之后可能导致其他线程在之后的一小段时间内还是可以读到旧的值。
使用原子类后,不用对方法加锁也可以保证线程安全。
四、介绍AtomicInteger类的原理
AtomicIntegert主要利用的还是CAS+volatile和native方法保证原子操作,避免了synchronized的高开销,执行效率就可以大为提升。
UnSafe 类的 objectFieldOffset() 方法是一个本地方法,这个方法是用来拿到“原来的值”的内存地址,返回值是 valueOffset。
另外 value 是一个 volatile 变量,在内存中可见,因此 JVM 可以保证任何时刻任何线程总能拿到该变量的最新值。