JAVA多线程并行计算乐观锁之Atomic系列详解

本文深入探讨JAVA中的乐观锁实现,重点分析Atomic系列,包括AtomicInteger等,解释其如何通过volatile和Unsafe确保内存可见性和原子性。同时,文章详细介绍了AtomicStampedRerence如何解决ABA问题,并通过示例展示了其实现机制。
摘要由CSDN通过智能技术生成
  1. 从多线程并行计算乐观锁 和 悲观锁 来讲,JAVA中的 lock、synchronized 属于悲观锁,即是在操作某数据的时候总是会认为多线程之间会相互干扰,属于阻塞式的加锁;Atomic系列则属于乐观锁系列,即当操作某一段数据的时候,线程之间是不会相互影响,采用非阻塞的模式,直到更新数据的时候才会进行版本的判断是否值已经进行了修改。

  2. Atomic在JAVA中的家族如下:
    a、基本类:AtomicInteger、AtomicLong、AtomicBoolean;
    b、引用类型:AtomicReference、AtomicReference的ABA实例、AtomicStampedRerence、AtomicMarkableReference;
    c、数组类型:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
    d、属性原子修改器(Updater):AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater

  3. 基本类型以AtomicInteger为代表进行讲解。
    首先我们来看看AtomicInteger的关键性代码如下:

    private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe();
    private volatile int value;

    public AtomicInteger(int initialValue) {
        value = initialValue;
    }
    public final int getAndIncrement() {
        return U.getAndAddInt(this, VALUE, 1);
    }

通过以上代码可以发现,内部定义了一个 volatile 修饰的 value,volatile修饰的变量我们知道保证了内存的的可见性,也就是volatile定义的值只会存在于内存,而抛弃了多核或者多CPU的多级缓存。

volatile保证了内存可见性,而sun.misc.Unsafe 则保证了原子性操作,因为Unsafe中引用了大量的native定义的本地代码,也就是C代码,并且采用CAS(compare and swap) 模式,保证了每次值的更新只会有一个线程会更新成功,其他更新失败的线程会进行循环,直到成功为止。

通过以上2点,这里找到了为什么Atomic除了能保证 volatile所具备的内存可见性功能外,还具备了原子性操作的原理。

请见unsafe的调用方法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值