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\n", i, ala.get(i));
17
18         System.out.printf("%20s : %s\n", "getAndDecrement(0)", ala.getAndDecrement(0));
19         System.out.printf("%20s : %s\n", "decrementAndGet(1)", ala.decrementAndGet(1));
20         System.out.printf("%20s : %s\n", "getAndIncrement(2)", ala.getAndIncrement(2));
21         System.out.printf("%20s : %s\n", "incrementAndGet(3)", ala.incrementAndGet(3));
22
23         System.out.printf("%20s : %s\n", "addAndGet(100)", ala.addAndGet(0, 100));
24         System.out.printf("%20s : %s\n", "getAndAdd(100)", ala.getAndAdd(1, 100));
25
26         System.out.printf("%20s : %s\n", "compareAndSet()", ala.compareAndSet(2, 31, 1000));
27         System.out.printf("%20s : %s\n", "get(2)", ala.get(2));
28     }
29 }

 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

原文地址:https://www.cnblogs.com/Hermioner/p/9905224.html

时间: 2024-08-15 15:55:40

Java多线程系列---“JUC原子类”04之 AtomicLongArray原子类的相关文章

Java多线程系列--“JUC线程池”04之 线程池原理(三)

本章介绍线程池的生命周期. 线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态.线程池也有5种状态:然而,线程池不同于线程,线程池的5种状态是:Running, SHUTDOWN, STOP, TIDYING, TERMINATED. 线程池状态定义代码如下: /** * The main pool control state, ctl, is an atomic integer packing * two conceptual fields * workerCount, indi

Java多线程系列--&ldquo;JUC锁&rdquo;04之 公平锁(二)

前面一章,我们学习了"公平锁"获取锁的详细流程:这里,我们再来看看"公平锁"释放锁的过程."公平锁"的获取过程请参考"Java多线程系列–"JUC锁"03之 公平锁(一)",锁的使用示例请参考"Java多线程系列–"JUC锁"02之 互斥锁ReentrantLock". 注意(01)这里是以"公平锁"来进行说明.(02)关于本章的术语,如"

Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3534050.html Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可

Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList

概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解CopyOnWriteArrayList.内容包括:CopyOnWriteArrayList介绍CopyOnWriteArrayList原理和数据结构CopyOnWriteArrayList函数列表CopyOnWriteArrayList源码分析(JDK1.7.0_40版本)Copy

Java多线程系列--“JUC锁”05之 非公平锁

获取非公平锁(基于JDK1.7.0_40) 非公平锁和公平锁在获取锁的方法上,流程是一样的:它们的区别主要表现在"尝试获取锁的机制不同".简单点说,"公平锁"在每次尝试获取锁时,都是采用公平策略(根据等待队列依次排序等待):而"非公平锁"在每次尝试获取锁时,都是采用的非公平策略(无视等待队列,直接尝试获取锁,如果锁是空闲的,即可获取状态,则获取锁).在前面的"Java多线程系列--"JUC锁"03之 公平锁(一)&q

Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet

概要 本章是JUC系列中的CopyOnWriteArraySet篇.接下来,会先对CopyOnWriteArraySet进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解CopyOnWriteArraySet.内容包括:CopyOnWriteArraySet介绍CopyOnWriteArraySet原理和数据结构CopyOnWriteArraySet函数列表CopyOnWriteArraySet源码(JDK1.7.0_40版本)CopyOnWriteArraySet

Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为"独占锁". 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有:而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取.ReentrantLock分为"公平锁"和"非公平锁".它们的区别体现在获取锁的机制上是否公平."锁"是为了保护竞争资源,防止多个线程同时操作线程而出错,ReentrantLock在

Java多线程系列--“JUC锁”04之 公平锁(二)

释放公平锁(基于JDK1.7.0_40) 1. unlock() unlock()在ReentrantLock.java中实现的,源码如下: public void unlock() { sync.release(1); } 说明:unlock()是解锁函数,它是通过AQS的release()函数来实现的.在这里,"1"的含义和"获取锁的函数acquire(1)的含义"一样,它是设置"释放锁的状态"的参数.由于"公平锁"是可重

Java多线程系列--“JUC线程池”01之 线程池架构

概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容——线程池.内容包括:线程池架构图线程池示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509903.html 线程池架构图 线程池的架构图如下: 1. Executor 它是"执行者"接口,它是来执行任务的.准确的说,Executor提供了execute()接口来执行