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


    转自:https://www.cnblogs.com/skywang12345/p/3514604.html(含部分修改)

    概要

    AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似。本章以AtomicLongArray对数组类型的原子类进行介绍。内容包括:

    • AtomicLongArray介绍和函数列表
    • AtomicLongArray源码分析(基于JDK1.7.0_40)
    • AtomicLongArray示例

    AtomicLongArray介绍和函数列表

    AtomicLong是作用是对长整形进行原子操作。而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源码为例,最终还是调用的Unsafe类中的compareAndSwapLong方法。

    举例:

     1 package com.test.a;
     2 
     3 // LongArrayTest.java的源码
     4 import java.util.concurrent.atomic.AtomicLongArray;
     5 
     6 public class LongArrayTest {
     7 
     8     public static void main(String[] args) {
     9 
    10         // 新建AtomicLongArray对象
    11         long[] arrLong = new long[] { 10, 20, 30, 40, 50 };
    12         AtomicLongArray ala = new AtomicLongArray(arrLong);
    13 
    14         ala.set(0, 100);
    15         for (int i = 0, len = ala.length(); i < len; i++)
    16             System.out.printf("get(%d) : %s
    ", i, ala.get(i));
    17 
    18         System.out.printf("%20s : %s
    ", "getAndDecrement(0)", ala.getAndDecrement(0));
    19         System.out.printf("%20s : %s
    ", "decrementAndGet(1)", ala.decrementAndGet(1));
    20         System.out.printf("%20s : %s
    ", "getAndIncrement(2)", ala.getAndIncrement(2));
    21         System.out.printf("%20s : %s
    ", "incrementAndGet(3)", ala.incrementAndGet(3));
    22 
    23         System.out.printf("%20s : %s
    ", "addAndGet(100)", ala.addAndGet(0, 100));
    24         System.out.printf("%20s : %s
    ", "getAndAdd(100)", ala.getAndAdd(1, 100));
    25 
    26         System.out.printf("%20s : %s
    ", "compareAndSet()", ala.compareAndSet(2, 31, 1000));
    27         System.out.printf("%20s : %s
    ", "get(2)", ala.get(2));
    28     }
    29 }
    View Code
     1 get(0) : 100
     2 get(1) : 20
     3 get(2) : 30
     4 get(3) : 40
     5 get(4) : 50
     6   getAndDecrement(0) : 100
     7   decrementAndGet(1) : 19
     8   getAndIncrement(2) : 30
     9   incrementAndGet(3) : 41
    10       addAndGet(100) : 199
    11       getAndAdd(100) : 19
    12      compareAndSet() : true
    13               get(2) : 1000
    View Code
  • 相关阅读:
    Vulnhub-靶机-BREACH: 3.0.1
    sqlmap从入门到精通-第六章-6-3 SOAP注入某SQL 2008服务器结合MSF进行提权
    sqlmap从入门到精通-第六章-6-2 使用sqlmap曲折渗透某服务器
    service xxx does not support chkconfig
    CentOS7安装ActiveMQ
    centos6.4 搭建svn服务器
    关于ZYNQ-7000中断调试一点感想
    闲谈SQL脚本优化
    小朋友学C语言(1):Hello World
    Python基础1
  • 原文地址:https://www.cnblogs.com/Hermioner/p/9905224.html
Copyright © 2020-2023  润新知