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

来源:互联网 发布:聚才道软件jucaidaorj 编辑:程序博客网 时间:2024/05/21 15:50

AtomicLongArray介绍和函数列表

在"Java多线程系列--“JUC原子类”02之 AtomicLong原子类"中介绍过,AtomicLong是作用是对长整形进行原子操作。而AtomicLongArray的作用则是对"长整形数组"进行原子操作。

AtomicLongArray函数列表


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


public final long incrementAndGet(int i) {

return addAndGet(i, 1);

}

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

addAndGet()源码如下:


说明: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);

}


AtomicLongArray示例


运行结果

get(0) : 100

get(1) : 20

get(2) : 30

get(3) : 40

get(4) : 50

getAndDecrement(0) : 100

decrementAndGet(1) : 19

getAndIncrement(2) : 30

incrementAndGet(3) : 41

addAndGet(100) : 199

getAndAdd(100) : 19

compareAndSet() : true

get(2) : 1000

0 0
原创粉丝点击