Atomic和Unsafe魔法类介绍

本文介绍了Java并发编程中的Atomic原子类,包括其五大类别及其常见方法。此外,还详细探讨了Unsafe类,讲解了其核心的CAS操作、内存屏障、获取私有变量值、线程挂起与恢复等关键功能,揭示了其在JUC包中的重要应用。
摘要由CSDN通过智能技术生成

Atomic原子类:

Atomic本意为不可分割的最小粒子,而原子操作(Atomic Operation)意味“不可中断的的一组操作”;
即使多线程高并发的执行的时候,一个操作一旦开始就不会被其它线程干扰;原子类就是具有原子操作的特征的类,它们能无锁的方式避免原子性问题

Juc包下的原子类都是位于atomic包下:
在这里插入图片描述
根据操作的数据类型,可以将JUC包下的原子类分为5大类:
1.基本类型:
AtomicInteger:整形原子类;
AtomicLong:长整型原子类;
AtomicBoolean:布尔型原子类;
2.数组类型:
AtomicIntegerArray:整形数组原子类;
AtomicLongArray:长整型数组原子类;
AtomicReferenceArray:引用类型数组原子类;
3.引用类型:
AtomicReference:引用类型原子类;
AtomicMarkableReference:原子更新带有标记的引用类型;
AtomicStampedReference:原子更新带有版本号的引用类型(利用版本号可以解决CAS中的ABA问题,原理就是比较交换数据时检查一下版本号);
4.对象的属性修改类型:
AtomicIntegerFieldUpdater:更新整形字段的原子类;
AtomicLongUpdater:更新长整型字段的原子类;
AtomicReferenceUpdater:更新引用类型字段的原子类;
5.原子累加器:
DoubleAccumulator;
DoubleAdder;
LongAccumuLator;
LongAdder;

看几个原子类的方法的源码:

AtomicInteger
//调用了魔法类Unsafe的方法:
 public final int incrementAndGet() {
   
    return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
再看一下Unsafe的getAndAddInt方法的实现方式:
public final int getAndAddInt(Object var1, long var2, int var4) {
   
    int var5;
    do {
   
	//传参为当前原子类对象,记录数据的value属性的偏移量;这样就可以拿到原始数据
        var5 = this.getIntVolatile(var1, var2);
//利用自旋和CAS来更新数据
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值