原子相关字段更新器

原子相关字段更新器

在java.util.concurrent.atomic包下提供了一些原子操作的数组

  • AtomicIntegerFieldUpdater
  • AtomicLongFieldUpdater
  • AtomicReferenceFieldUpdater

下面以AtomicIntegerFieldUpdater为例进行说明,该类可以对原子整数字段进行更新,该整数字段必须是volatile修饰,且必须是实例变量,不能加final修饰。

创建User类,构造方法,toString等略

public class User {
    int id;
    volatile int age;
    
}

创建线程类

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

public class MyThread implements Runnable {

    private User user;

    //创建字段更新器对象,里面指定要更新的字段名
    private AtomicIntegerFieldUpdater<User> fieldUpdater =
            AtomicIntegerFieldUpdater.newUpdater(User.class, "age");

    public MyThread(User user) {
        this.user = user;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            //让user中的age自增
            System.out.println(fieldUpdater.getAndIncrement(user));
        }
    }
}

创建测试类

import java.util.concurrent.TimeUnit;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        User user = new User(1, 5);
        MyThread mt = new MyThread(user);

        //启动5个线程
        for (int i = 0; i < 5; i++) {
            new Thread(mt).start();
        }

        TimeUnit.SECONDS.sleep(2);

        System.out.println(user);
    }
}