12. 线程安全类型-原子类型

java 多线程系列文章列表, 请查看目录: 《java 多线程学习笔记》

1. 原子类型

从java5 之后, java.util.concurrent.atomic 包下, 新增了一组原子类, 是基本类型对应的线程安全的类型. 命名为AtomicXXX

1.1 常用原子类

java.util.concurrent.atomic

  • AtomicInteger: 原子整型
  • AtomicLong: 原子Long 型
  • AtomicBoolean: 原子布尔型
  • AtomicIntegerArray: 原子整型数组
  • AtomicLongArray: 原子long型数组

1.2 原子整型API

原子类型均提供了一组线程安全的原子操作, 不同类型提供的API 也不一样. 笔者拿原子整型来距离

方法签名 方法描述
public final void set(int newValue) 设置值
public final int get() 获取当前值
public final int getAndIncrement() 先获取当前值, 再自增1
public final int incrementAndGet() 先自增1, 再获取当前值
public final int getAndDecrement() 先获取当前值, 再自减1
public final int decrementAndGet() 先自减1, 再获取当前值
public final int getAndAdd(int delta) 先获取, 再自增固定值
public final int addAndGet(int delta) 先自增固定值, 再获取

2. 原子类型用法示例

2.1 多线程进行分页初始化

public class InitService {

    private AtomicInteger pager = new AtomicInteger(0);

    public void init() {
        int page = pager.getAndAdd(1);
        System.out.println(Thread.currentThread().getName() + "-初始化第" + page + "页数据!");
    }

    public static void main(String[] args) {

        InitService userService = new InitService();

        // 启动3个线程执行方法
        for (int i = 0; i <3; i++) {
            new Thread(){
                @Override
                public void run() {
                    while (true) {
                        userService.init();
                        ThreadUtil.sleep(5);
                    }
                }
            }.start();
        }

    }
}

2.2 测试输出

Thread-1-初始化第2页数据!
Thread-0-初始化第0页数据!
Thread-2-初始化第1页数据!
Thread-1-初始化第3页数据!
Thread-0-初始化第4页数据!
Thread-2-初始化第5页数据!
Thread-1-初始化第6页数据!
Thread-0-初始化第7页数据!
Thread-2-初始化第8页数据!
Thread-1-初始化第9页数据!
Thread-0-初始化第10页数据!

你可能感兴趣的:(juc)