原子类
1.介绍
JDK原子类基于CAS轻量级原子操作实现,使得程序运行效率变得更高
Atomic操作翻译成中文,是指一个不可中断的操作,即使在多个线程一起执行Atomic类型操作的时候,一个操作一旦开始,就不会被其他线程中断。所谓Atomic类,指的是具有原子操作特征的类
JUC并发包中原子类 , 都存放 在java.util.concurrent.atomic类路径下
所用的使用方式大同小异,这里只介绍几种基础的类的用法
2.分类
- 基本原子类
- AtomicInteger:整型原子类
- AtomicLong:长整型原子类
- AtomicBoolean:布尔型原子类
- 数组原子类
- AtomicIntegerArray:整型数组原子类
- AtomicLongArray:长整型数组原子类
- AtomicReferenceArray:引用类型数组原子类
- 原子引用类型
- AtomicReference:引用类型原子类
- AtomicMarkableReference:带有更新标记位的原子引用类型
- AtomicStampedReference:带有更新版本号的原子引用类型
- 字段更新原子类
- AtomicIntegerFieldUpdater:原子更新整型字段的更新器
- AtomicLongFieldUpdater:原子更新长整型字段的更新器
- AtomicReferenceFieldUpdater:原子更新引用类型里的字段
3.AtomicInteger
常用方法
- public final int get():获取当前的值
- public final int getAndSet(int newValue):获取当前的值,然后设置新的值
- public final int getAndIncrement():获取当前的值,然后自增
- public final int getAndDecrement():获取当前的值,然后自减
- public final int getAndAdd(int delta):获取当前的值,并加上预期的值
- 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());
}
}