zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/Hermioner/p/9905224.html
Copyright © 2011-2022 走看看