一、作用
保证对数据操作是原子性的
二、原理
Unsafe类实现CAS
三、原子类列表
原子类 | 原子类数组 | 原子类属性更新器 | |
布尔值 | AtomicBoolean | ||
整型 | AtomicInteger | AtomicIntegerArray | AtomicIntegerFieldUpdater |
Long | AtomicLong | AtomicLongArray | AtomicLongFieldUpdater |
引用 | AtomicReference | AtomicReferenceArray | AtomicReferenceFieldUpdater |
引用,带标记 | AtomicMarkableReference | ||
引用,带计数 | AtomicStampedReference |
四、常用API
设置 | set |
获取 | get |
先获取,再加 n | getAndAdd |
先加 n,再获取 | addAndGet |
先获取,再减 1 | getAndDecrement |
先减 1,再获取 | decrementAndGet |
先获取,再加1 | getAndIncrement |
先加 1,再获取 | incrementAndGet |
比较再设置,返回boolean | compareAndSet(旧值, 新值) |
比较再设置,返回旧值 | compareAndExchange(旧值, 新值) |
等等… |
五、原子类属性更新器
AtomicXXFieldUpdater
作用:
将实例的普通属性 进行 原子操作
条件:
实例属性类型必须是volatile,并且可以直接访问该属性
属性更新器 | 实例属性类型 | 创建方法 |
AtomicIntegerFieldUpdater | 必须是volatile int | newUpdater(实例类.class, “字段名”) |
AtomicLongFieldUpdater | 必须是volatile long | newUpdater(实例类.class, “字段名”) |
AtomicReferenceFieldUpdater | 必须是volatile T | newUpdater(实例类.class, 字段类.class,“字段名”) |
使用:
public class User{
volatile int id;
volatile String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
}
例子一、AtomicIntegerFieldUpdater
User user = new User( 10010, "码鹿" );
AtomicIntegerFieldUpdater<User> idUpdater = AtomicIntegerFieldUpdater.newUpdater(User.class, "id");
idUpdater.compareAndSet(user, 10010, 10086);
例子二、AtomicReferenceFieldUpdater
User user = new User( 10010, "码鹿" );
AtomicReferenceFieldUpdater<User, String> nameUpdater = AtomicReferenceFieldUpdater.newUpdater(User.class, String.class, "name");
nameUpdater.compareAndSet(user, "码鹿", "码鹿鸭");
缺点
Atomic类在高并发情况下,
同一时间只有一个线程CAS成功,其他线程会循环重试,
所以并发量越高 性能越差。
更新
JDK8 引入 累加器