zoukankan      html  css  js  c++  java
  • JUC原子类3-AtomicLongArray原子类

    概要:

    AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray这三个数组类型的原子类的原理和用法相似。本文章以AtomicLongArray对数组类型的原子类进行介绍。

    AtomicLongArray介绍和函数列表

    AtomicLongArray的作用是对“长整型数组”进行原子操作。

    函数列表:

    // 创建给定长度的新 AtomicLongArray。
    AtomicLongArray(int length)
    // 创建与给定数组具有相同长度的新 AtomicLongArray,并从给定数组复制其所有元素。
    AtomicLongArray(long[] array)
    
    // 以原子方式将给定值添加到索引 i 的元素。
    long addAndGet(int i, long delta)
    // 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
    boolean compareAndSet(int i, long expect, long update)
    // 以原子方式将索引 i 的元素减1。
    long decrementAndGet(int i)
    // 获取位置 i 的当前值。
    long get(int i)
    // 以原子方式将给定值与索引 i 的元素相加。
    long getAndAdd(int i, long delta)
    // 以原子方式将索引 i 的元素减 1。
    long getAndDecrement(int i)
    // 以原子方式将索引 i 的元素加 1。
    long getAndIncrement(int i)
    // 以原子方式将位置 i 的元素设置为给定值,并返回旧值。
    long getAndSet(int i, long newValue)
    // 以原子方式将索引 i 的元素加1。
    long incrementAndGet(int i)
    // 最终将位置 i 的元素设置为给定值。
    void lazySet(int i, long newValue)
    // 返回该数组的长度。
    int length()
    // 将位置 i 的元素设置为给定值。
    void set(int i, long newValue)
    // 返回数组当前值的字符串表示形式。
    String toString()
    // 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
    boolean    weakCompareAndSet(int i, long expect, long update)

    incrementAndGet()的源码如下:

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

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

    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);
    }
  • 相关阅读:
    HDU 3579 Hello Kiki 中国剩余定理
    DHU 1788 Chinese remainder theorem again 中国剩余定理
    初学--求解模线性方程组(中国余数定理)。
    山东第四届省赛: Boring Counting 线段树
    山东第四届省赛C题: A^X mod P
    福州大学oj 1752 A^B mod C ===>数论的基本功。位运用。五星*****
    HDU 1576 A/B 暴力也能过。扩展欧几里得
    POJ 1061 青蛙的约会 扩展欧几里德--解不定方程
    HDU 2669 Romantic 扩展欧几里德---->解不定方程
    南阳nyoj 56 阶乘因式分解(一)
  • 原文地址:https://www.cnblogs.com/qumasha/p/12824957.html
Copyright © 2011-2022 走看看