Java的原子类有哪些?

1 个回答

  • ketty
    不必太张扬,是花自然香。
    原子类一共有以下四种 1.基本类型: AtomicInteger, AtomicLong, AtomicBoolean ; 2.数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ; 3.引用类型: AtomicReference, AtomicStampedRerence, AtomicMarkableReference ; 4.对象的属性修改类型: AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, AtomicReferenceFieldUpdater 。 AtomicInteger 主要是对Integer的封装,提供了一些原子性的操作,因为如果是使用Integer来完成i=i+1;操作,在内存中是三个步骤,先将从内存中取出i,放到寄存器中,然后将寄存器中的值与1相加,然后将结果写入内存,一共是三个步骤,所以不是原子性的,并发时会造成数据不一致的问题。 主要实现原理是AtomicInteger类有一个unsafe属性,可以通过unsafe来调用Unsafe类的一些原子性的方法Unsafe.compareAndSwapInt来实现原子性的加减运算。 其次是使用volatile来修饰value属性,保证一个内存可见性 ```java //compareAndSwapInt有四个参数,第一个是待运算的对象,第二个是对象中用于运算的属性的偏移量,第三个是期望值,第四个是更新的值。 unsafe.compareAndSwapInt(this, valueOffset, expect, update) ``` ```java public class AtomicInteger extends Number implements java.io.Serializable { private static final long serialVersionUID = 6214790243416807050L; // setup to use Unsafe.compareAndSwapInt for updates private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final long valueOffset; static { try { valueOffset = unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } } private volatile int value;//使用volatiole来保证value的内存可见性 } ``` 在Unsafe类中,compareAndSwapInt和getAndAddInt的区别在于,getAndAddInt会一直重试直到成功,compareAndSwapInt如果更新失败,只会返回false ```java public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { //var1是对象,var2是对象上某个变量的偏移量, //var5就是对象var1上偏移量为var2的一个变量 var5 = this.getIntVolatile(var1, var2); //当var5的值没有变化时,就会进行加法操作,也就是var5 = var5 + var4 //如果var5的值变化了,就会取最新的var5的值,进行加法操作。 } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; } ```
    发布于 2022-02-10 06:51 •IP属地 云南
    举报
    评论
    收藏