原子类(jdk1.5操出现的)提供原子操作,主要分为以下四类:
- 原子更新基本类型
- 原子更新数组
- 原子更新抽象类型
- 原子更新字段
1、原子更新操作类
AtomicInteger(int)、AtomicLong(long)、AtomicBoolean(boolean);
他们提供的方法基本一致:
方法 | 作用 |
---|---|
int addAndGet(int delta) | 以原子方式将输入的数值与实例中的值相加并返回结果 |
boolean compareAndSet(int expect,int update) | 如果输入的数值等于预期值,则以原子方式将该值设置为输入的值 |
int getAndIncrement() | 以原子方式将当前值加1,然后返回自增前的值 |
void lazySet(int newValue) | 最终会设置成newValue,使用lazeSet设置值后,可能导致其他线程在之后的一小段时间内还是可以读取到旧值 |
int getAndSet(int newValue) | 以原子方式设置为newValue的值,并返回旧值 |
int get() | 获取实际的值 |
那它更新值的操作是如何实现的呢?
里面用到了Unsafe这个类,并且在可重入锁等很多线程相关的类里面都用到了它,
这就是它的介绍;
2、原子更新数组
AtomicIntegerArray(int)、AtomicLongArray(long)、AtomicReferenceArray(引用类型);
方法 | 作用 |
---|---|
int get(int i) | 获取第i个数组下标中的值 |
void set(int i, int newValue) | 设置第i个数组下标中的值 |
boolean compareAndSet(int i, int expect, int update) | 输入的第i个下标等于预期值,则以原子方式将该值设置为输入的值,并返回是否成功 |
int getAndSet(int i, int newValue) | 以原子的方式将数字第i的值设置为新值 |
int getAndIncrement(int i) | 以原子的方式将第i的值加一,并返回 |
3、原子更新抽象类型
AtomicReference、AtomicReferenceFieldUpdater、AtomicMarkableReference
方法 | 作用 |
---|---|
AtomicIntegerFieldUpdaterImpl(final Class tclass,final String fieldName,final Class<?> caller) | 构造函数需要传入class 和 字段名称 |
void set(T obj, int newValue) | 设置第i个数组下标中的值 |
boolean compareAndSet(T obj, int expect, int update) | 输入的第i个下标等于预期值,则以原子方式将该值设置为输入的值,并返回是否成功 |
int getAndSet(T obj, int newValue) | 以原子的方式将数字第i的值设置为新值 |
4、原子更新字段(属性)
AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicStampedReference
方法 | 作用 |
---|---|
void set(V newValue) | 设置值 |
boolean compareAndSet(V expect, V update) | 通过CAS操作更新值 |
V getAndSet(V newValue) | 以原子的方式将数字设置为新值 |