AtomicLong、AtomicIntger源码分析

本文探讨了Java的Atomic包,重点分析了AtomicLong的源码。Atomic包基于CAS(Check and Set)机制,利用Unsafe类实现底层硬件级别的原子操作。AtomicLong的加减操作在1.7之后变得更加简洁,主要通过Unsafe类的循环比较来确保原子性。文中还提供了一个简单的使用示例。
摘要由CSDN通过智能技术生成

    Atomic原子包下大概可以分成三类,AtomicInteger、AtomicLong、AtomicBoolean这三个是类似的,这里只写一下AtomicLong相关源码。

    Atomic包是基于CAS实现的,CAS需要三个值,分别是要更新的值V,期望值E和新值N。当且仅当V和E相等的时候才可以使用新值对V进行替换,当发生冲突时就循环此过程知道成功为止。CAS是基于UNSAFE这个类实现的,这个类拥有直接修改内存,从硬件层面操纵数据,赋值等操作,还可以修改指针,因此是不安全的类。

    这个类本身比较简练,因此代码都放在下面了。其中最重要的地方在于原子性的加法或减法比1.7更加简练,在Unsafe类中进行循环比较。

// 获取Unsafe实例,这个实例只有顶级类加载器加载的类才可以使用
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset; //地址偏移量

    /**
     * Records whether the underlying JVM supports lockless
     * compareAndSwap for longs. While the Unsafe.compareAndSwapLong
     * method works in either case, some constructions should be
     * handled at Java level to avoid locking user-visible locks.
     */
    static final boolean VM_SUPPORTS_LONG_CAS = VMSupportsCS8();

    /**
     * Returns whether underlying JVM supports lockless CompareAndSet
     * for longs. Called only once and cached in VM_SUPPORTS_LONG_CAS.
     */
    private static native boolean VMSupportsCS8();
     //获取value这个值在地址中的偏移值。
    static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicLong.class.getDeclaredField("value"));
        } c
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值