Java并发包之AtomicXX

Java并发包之AtomicXX

 

我们都知道java并发包下面总共有几大类:

1. 执行者与线程池 
2. 并发队列 
3. 同步工具 
4. 并发集合 
5. 锁 
6. 原子变量

我们今天就来了解一下原子变量,也就是java.util.concurrent.atomic.AtomicXX,本文中就以AtomicInteger为例。

首先打开AtomicInteger类

  /**
     * Atomically sets to the given value and returns the old value.
     *
     * @param newValue the new value
     * @return the previous value
     */
    public final int getAndSet(int newValue) {
        return unsafe.getAndSetInt(this, valueOffset, newValue);
    }

 

可以看到几乎所有的方法都是通过一个叫Unsafe的类进行调用的,那这个Unsafe到底是一个什么东西呢。

Unsafe类是在sun.misc包下,不属于Java标准。但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Cassandra、Hadoop、Kafka等。Unsafe类在提升Java运行效率,增强Java语言底层操作能力方面起了很大的作用。

这里就不做具体详细的讲解,后续会专门写篇文章来讲讲Unsafe类,我们只需要知道Unsafe调用的是一些底层其他语言(C/C++等)实现的API。

 

下面我们详细讲解getAndSet(int newValue)方法,里面的实现很简单,unsafe.getAndSetInt(this,valueOffset,newValue)

  this和newValue不用讲,一个是当前对象,一个是需要set的值。

  valueOffset是个什么东东,其实它是一个偏移量,可以简单的理解为一个地址,通过这个地址就能够获取变量的值。

 

继续点进去看看unsafe是怎么实现的

public final int getAndSetInt(Object obj, long valueOffset, int newValue) {
    int oldValue;
    do {
        oldValue = this.getIntVolatile(obj, valueOffset);
    } while(!this.compareAndSwapInt(obj, valueOffset, oldValue, newValue));

    return oldValue;
}

首先根据传进来的偏移量获取内存中要更新的变量的当前值

然后调用compareAndSwapInt方法进行值的更新,若更新成功则直接返回,若更新不成功则继续循环更新直至更新成功为止。

 

实际上这就是CAS方法。通过与内存中的值进行比较来保证更新,所有的一切都在this.compareAndSwapInt这个native方法里,这里面调用的是jvm里面的实现,有兴趣的可以去看看jvm实现

 

总的来说是需要依赖操作系统总线锁来保证原子性

 

 

 
 

 

转载于:https://www.cnblogs.com/foolever/p/8990005.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值