AtomicInteger 类

其余几个类与此实现类似

  1. /**
  2. * Atomically increments by one the current value.
  3. *
  4. * @return the previous value
  5. */
  6. public final int getAndIncrement() {
  7. return unsafe.getAndAddInt(this, valueOffset, 1);
  8. }

  1. /**
  2. * Atomically decrements by one the current value.
  3. *
  4. * @return the previous value
  5. */
  6. public final int getAndDecrement() {
  7. return unsafe.getAndAddInt(this, valueOffset, -1);
  8. }

valueOffset 值,在 AtomicInteger 类的静态代码块中初始化,unsafe.objectFieldOffset 用户获取某个字段相对Java对象的“起始地址”的偏移量

  1. static {
  2. try {
  3. valueOffset = unsafe.objectFieldOffset
  4. (AtomicInteger.class.getDeclaredField("value"));
  5. } catch (Exception ex) { throw new Error(ex); }
  6. }

UnSafe类
此处三个参数,分别表示

  1. /**
  2. * Atomically adds the given value to the current value of a field
  3. * or array element within the given object <code>o</code>
  4. * at the given <code>offset</code>.
  5. *
  6. * @param o object/array to update the field/element in 对象
  7. * @param offset field/element offset 对象属性偏移值
  8. * @param delta the value to add 变化值
  9. * @return the previous value
  10. * @since 1.8
  11. */
  12. public final int getAndAddInt(Object o, long offset, int delta) {
  13. int v;
  14. do {
  15. v = getIntVolatile(o, offset);
  16. } while (!compareAndSwapInt(o, offset, v, v + delta));
  17. return v;
  18. }

ABA 问题

增加版本号概念

AtomicXXXFieldUpdater

为什么需要?如果一个类是自己编写的,可以直接定义成员变量为 Atomic类,但如果是一个已有的类,在不能修改源代码的情况下,要想实现对其成员变量的院子操作,就需要AtomicXXXFieldUpdater类了

  • AtomicIntegerFieldUpdater
  • AtomicLongFieldUpdater
  • AtomicReferenceFieldUpdater

实现原理

构造对象时,传入要修改的类和对应的成员变量的名字,内部会通过反射拿到这个类的成员变量的偏移值,在真实需要修改某个对象的成员变量值的时候,再传入相应的对象,最后调用UnSafe类的方法(类似getAndAddInt方法,参数有 object,offset值,变化值)

Atomic 数组操作类

  • AtomicIntegerArray
  • AtomicLongArray
  • AtomicReferenceArray

这里不是说整个数组的操作是原子的,而是针对数组的一个元素的原子操作,所以相关操作方法都多个一个参数,数组下标 i

实现原理

把数组下标 i 转换为相应的内存偏移量,然后底层函数还是 UnSafe 的 compareAndSwapInt 等