【JDK 5】JUC Atomic 原子类

43 阅读1分钟

一、作用

保证对数据操作是原子性的


二、原理

Unsafe类实现CAS


三、原子类列表

原子类原子类数组原子类属性更新器
布尔值AtomicBoolean
整型AtomicIntegerAtomicIntegerArrayAtomicIntegerFieldUpdater
LongAtomicLongAtomicLongArrayAtomicLongFieldUpdater
引用AtomicReferenceAtomicReferenceArrayAtomicReferenceFieldUpdater
引用,带标记AtomicMarkableReference
引用,带计数AtomicStampedReference

四、常用API

设置set
获取get
先获取,再加 ngetAndAdd
加 n,再获取addAndGet
先获取,再减 1getAndDecrement
减 1,再获取decrementAndGet
先获取,再加1getAndIncrement
加 1,再获取incrementAndGet
比较再设置,返回booleancompareAndSet(旧值, 新值)
比较再设置,返回旧值compareAndExchange(旧值, 新值)
等等...

五、原子类属性更新器 

AtomicXXFieldUpdater

作用:

将实例的普通属性 进行 原子操作

条件:

实例属性类型必须是volatile,并且可以直接访问该属性

属性更新器实例属性类型创建方法
AtomicIntegerFieldUpdater必须是volatile intnewUpdater(实例类.class, "字段名")
AtomicLongFieldUpdater必须是volatile longnewUpdater(实例类.class, "字段名")
AtomicReferenceFieldUpdater必须是volatile TnewUpdater(实例类.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 引入 累加器