Skip to content

Latest commit

 

History

History
155 lines (113 loc) · 4.32 KB

01-Java中13个原子操作类.md

File metadata and controls

155 lines (113 loc) · 4.32 KB

Java中13个原子操作类

分类

  • 原子更新基本类型
    • AtomicBoolean
    • AtomicInteger
    • AtomicLong
  • 原子更新数组
    • AtomicIntegerArray
    • AtomicLongArray
    • AtomicReferenceArray
  • 原子更新引用类型
    • AtomicReference
    • AtomicReferenceFieldUpdater :原子更新引用类型里的字段
    • AtomicMarkableReference :原子更新带有标记位的引用类型
  • 原子更新字段类
    • AtomicIntegerFieldUpdater :原子更新 Integer 字段的更新器
    • AtomicLongFieldUpdater :原子更新长 Long 字段的更新器
    • AtomicStampedReference :原子更新带版本号的引用类型。即将整数的版本号值与引用关联起来,每一次更新都会改变版本号值,可以用来解决 CAS 中的 ABA 问题

AtomicInteger 的常用方法

// 原子方式将数值加delta,并返回
public final int addAndGet(int delta)

// 如果oldValue == expect,将它更新为update
public final boolean compareAndSet(int expect, int update)
    
// 类似i++操作,返回的是旧值
public final int getAndIncrement()
    
// 最终会设置为newValue,使用lazySet设置后,可能在之后的一段中,其他线程读到的还是旧值
public final void lazySet(int newValue)
    
// 原子方式设置新值,并返回旧值
public final int getAndSet(int newValue)

使用方法:

public class AtomicIntegerDemo {
    static AtomicInteger ai = new AtomicInteger(1);
    
    public static void main(String[] args) {
        System.out.println(ai.getAndIncrement());
        System.out.println(ai.get());
    }
}

AtomicIntegerArray 的常用方法

// 对数组索引为i的元素进行addAndGet(int delta)操作
public final int addAndGet(int i, int delta)
    
// 对数组索引为i的元素进行compareAndSet(int expect, int update)操作
public final boolean compareAndSet(int i, int expect, int update)

使用方法:

public class AtomicIntegerArrayDemo {
    static int[] value = new int[] {1, 2};
    static AtomicIntegerArray ai = new AtomicIntegerArray(value);
    
    public static void main(String[] args) {
        ai.getAndSet(0, 3)
        System.out.println(ai.get(0));
        System.out.println(value[0]);
    }
}

AtomicReference 使用示例

public class AtomicReferenceDemo {
    public static AtomicReference<User> ar = 
        new AtomicReference<User>();
    
    public static void main(String[] args) {
        User user = new User("user", 15);
        ar.set(user);
        System.out.println(ar.get().name);
        System.out.println(ar.get().old);
    }
    
    public static class User {
        public String name;
        public int old;
        
        public User(String name, int old) {
            this.name = name;
            this.old = old;
        }
    }
}

AtomicIntegerFieldUpdater 使用示例

想要原子的更新字段需要两步:

  • public static <U> AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName) 得到更新器实例,设置想要进行原子更新的类和具体的属性
  • 更新类的字段必须使用 public volatile 修饰

示例:

public class AtomicIntegerFieldUpdaterDemo {
    private static AtomicIntegerFieldUpdater<User> updater = 
        AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
    
    public static void main(String[] args) {
        User user = new User("user", 10);
        System.out.println(updater.getAndIncrement(user));
        System.out.println(user.old);
    }
    
    public static class User {
        public String name;
        public volatile int old;
        
        public User(String name, int old) {
            this.name = name;
            this.old = old;
        }
    }
}