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页数据!