[关闭]
@boothsun 2018-03-09T09:32:21.000000Z 字数 2007 阅读 1125

Java中的13个原子操作类

Java多线程


在Atomic包里一共提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)。Atomic包里的类基本都是使用Unsafe实现的包装类。

原子更新基本类型类

使用原子的方式更新基本类型,Atomic包提供了以下3个类:

以上3个类提供的方法几乎一模一样,所以这里仅以AtomicInteger为例进行讲解,AtomicInteger的常用方法如下:

原子更新数组

通过原子的方式更新数组里的某个元素,Atomic包提供了以下4个类:

AtomicIntegerArray类主要是提供原子的方式更新数组里的整型,其常用方法如下:

原子更新引用类型

原子更新基本类型的AtomicInteger,只能更新一个变量,如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类。Atomic包提供了以下3个类:

上面的三大类原子更新的方法都是以自旋+CAS的形式来保证原子更新的。

  1. // AtomicInteger
  2. public final int getAndIncrement() {
  3. return unsafe.getAndAddInt(this, valueOffset, 1);
  4. }
  5. public final int getAndAddInt(Object var1, long var2, int var4) {
  6. int var5;
  7. do {
  8. var5 = this.getIntVolatile(var1, var2);
  9. } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
  10. return var5;
  11. }
  12. // AtomicIntegerArray
  13. public final int getAndAdd(int i, int delta) {
  14. return unsafe.getAndAddInt(array, checkedByteOffset(i), delta);
  15. }
  16. public final int getAndAddInt(Object var1, long var2, int var4) {
  17. int var5;
  18. do {
  19. var5 = this.getIntVolatile(var1, var2);
  20. } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
  21. return var5;
  22. }
  23. // AtomicReference
  24. public final V getAndSet(V newValue) {
  25. return (V)unsafe.getAndSetObject(this, valueOffset, newValue);
  26. }
  27. public final Object getAndSetObject(Object var1, long var2, Object var4) {
  28. Object var5;
  29. do {
  30. var5 = this.getObjectVolatile(var1, var2);
  31. } while(!this.compareAndSwapObject(var1, var2, var5, var4));
  32. return var5;
  33. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注