多线程(五)—— 原子更新操作类

原子类(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) 以原子的方式将数字设置为新值

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/89442593