java多线程--AtomicLongArray

Posted 通凡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程--AtomicLongArray相关的知识,希望对你有一定的参考价值。

AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似。本章以AtomicLongArray对数组类型的原子类进行介绍。AtomicLongArray的作用则是对"长整形数组"进行原子操作。

AtomicLongArray源码分析(基于JDK1.7.0_40)

AtomicLongArray的完整源码

     完整源码请参见http://www.cnblogs.com/skywang12345/p/3514604.html

 

AtomicLongArray的代码很简单,下面仅以incrementAndGet()为例,对AtomicLong的原理进行说明。
incrementAndGet()源码如下:

public final long incrementAndGet(int i) {
    return addAndGet(i, 1);
}

说明:incrementAndGet()的作用是以原子方式将long数组的索引 i 的元素加1,并返回加1之后的值。

 

addAndGet()源码如下:

public long addAndGet(int i, long delta) {
    // 检查数组是否越界
    long offset = checkedByteOffset(i);
    while (true) {
        // 获取long型数组的索引 offset 的原始值
        long current = getRaw(offset);
        // 修改long型值
        long next = current + delta;
        // 通过CAS更新long型数组的索引 offset的值。
        if (compareAndSetRaw(offset, current, next))
            return next;
    }
}

说明:addAndGet()首先检查数组是否越界。如果没有越界的话,则先获取数组索引i的值;然后通过CAS函数更新i的值。

 

getRaw()源码如下:

private long getRaw(long offset) {
    return unsafe.getLongVolatile(array, offset);
}

说明:unsafe是通过Unsafe.getUnsafe()返回的一个Unsafe对象。通过Unsafe的CAS函数对long型数组的元素进行原子操作。如compareAndSetRaw()就是调用Unsafe的CAS函数,它的源码如下:

private boolean compareAndSetRaw(long offset, long expect, long update) {
    return unsafe.compareAndSwapLong(array, offset, expect, update);
}

以上是关于java多线程--AtomicLongArray的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程系列---“JUC原子类”04之 AtomicLongArray原子类

Java并发AtomicLongArray类

ava多线程系列 JUC原子类 CAS及原子类

Java多线程——Thread的native底层实现

神仙文档啊!JVM,多线程,MySQL,分布式应有尽有!

Java多线程学习之synchronized总结