06.原子类

54 阅读2分钟

原子类

1.介绍

JDK原子类基于CAS轻量级原子操作实现,使得程序运行效率变得更高

Atomic操作翻译成中文,是指一个不可中断的操作,即使在多个线程一起执行Atomic类型操作的时候,一个操作一旦开始,就不会被其他线程中断。所谓Atomic类,指的是具有原子操作特征的类

JUC并发包中原子类 , 都存放 在java.util.concurrent.atomic类路径下

af719893ddbc43c19b36b98f1a51f6e9.png

1749703471661.png

所用的使用方式大同小异,这里只介绍几种基础的类的用法

2.分类

  1. 基本原子类
    • AtomicInteger:整型原子类
    • AtomicLong:长整型原子类
    • AtomicBoolean:布尔型原子类
  2. 数组原子类
    • AtomicIntegerArray:整型数组原子类
    • AtomicLongArray:长整型数组原子类
    • AtomicReferenceArray:引用类型数组原子类
  3. 原子引用类型
    • AtomicReference:引用类型原子类
    • AtomicMarkableReference:带有更新标记位的原子引用类型
    • AtomicStampedReference:带有更新版本号的原子引用类型
  4. 字段更新原子类
    • AtomicIntegerFieldUpdater:原子更新整型字段的更新器
    • AtomicLongFieldUpdater:原子更新长整型字段的更新器
    • AtomicReferenceFieldUpdater:原子更新引用类型里的字段

3.AtomicInteger

常用方法

  1. public final int get():获取当前的值
  2. public final int getAndSet(int newValue):获取当前的值,然后设置新的值
  3. public final int getAndIncrement():获取当前的值,然后自增
  4. public final int getAndDecrement():获取当前的值,然后自减
  5. public final int getAndAdd(int delta):获取当前的值,并加上预期的值
  6. boolean compareAndSet(int expect, int update):通过CAS方式设置整数值

代码案例

public class Test1 {
    
    @Test
    public void atomicIntegerTest(){
        int tempvalue = 0;
        //定义一个整数原子类实例,赋值到变量 i 
        AtomicInteger i = new AtomicInteger(0);
        //取值,然后设置一个新值
        tempvalue = i.getAndSet(3);
        //输出 tempvalue:0; i:3
        System.out.println("tempvalue:" + tempvalue + "; i:" + i.get());
        //取值,然后自增
        tempvalue = i.getAndIncrement();
        //输出 tempvalue:3; i:4
        System.out.println("tempvalue:" + tempvalue + "; i:" + i.get());
        //取值,然后增加 5
        tempvalue = i.getAndAdd(5);
        
        //输出 tempvalue:4; i:9
        System.out.println"tempvalue:" + tempvalue + "; i:" + i.get());
        //CAS 交换
        boolean flag = i.compareAndSet(9, 100);
        //输出 flag:true; i:100
        System.out.println("flag:" + flag + "; i:" + i.get());
    }
    
}

4.AtomicReference

介绍

保证引用对象的原子修改类

代码案例

public class AtomicReferenceTest {
    public static void main(String[] args) {
        AtomicReference<User> atomicReference = new AtomicReference();
        User a = new User("z3",22);
        User b = new User("l4",28);
        atomicReference.set(a);
        atomicReference.compareAndSet(a,b);
        System.out.println(atomicReference.get());
    }
}