AtomicIntegerArray源码分析与感悟

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

《Java高级架构知识》

《算法知识》

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

shift = 31 - Integer.numberOfLeadingZeros(scale);

}

private long checkedByteOffset(int i) {

if (i < 0 || i >= array.length)

throw new IndexOutOfBoundsException("index " + i);

return byteOffset(i);

}

private static long byteOffset(int i) {

return ((long) i << shift) + base;

}

/**

  • Creates a new AtomicIntegerArray of the given length, with all

  • elements initially zero.

  • @param length the length of the array

*/

public AtomicIntegerArray(int length) {

array = new int[length];

}

/**

  • Creates a new AtomicIntegerArray with the same length as, and

  • all elements copied from, the given array.

  • @param array the array to copy elements from

  • @throws NullPointerException if array is null

*/

public AtomicIntegerArray(int[] array) {

// Visibility guaranteed by final field guarantees

this.array = array.clone();

}

/**

  • Returns the length of the array.

  • @return the length of the array

*/

public final int length() {

return array.length;

}

/**

  • Gets the current value at position {@code i}.

  • @param i the index

  • @return the current value

*/

public final int get(int i) {

return getRaw(checkedByteOffset(i));

}

private int getRaw(long offset) {

return unsafe.getIntVolatile(array, offset);

}

/**

  • Sets the element at position {@code i} to the given value.

  • @param i the index

  • @param newValue the new value

*/

public final void set(int i, int newValue) {

unsafe.putIntVolatile(array, checkedByteOffset(i), newValue);

}

/**

  • Eventually sets the element at position {@code i} to the given value.

  • @param i the index

  • @param newValue the new value

  • @since 1.6

*/

public final void lazySet(int i, int newValue) {

unsafe.putOrderedInt(array, checkedByteOffset(i), newValue);

}

/**

  • Atomically sets the element at position {@code i} to the given

  • value and returns the old value.

  • @param i the index

  • @param newValue the new value

  • @return the previous value

*/

public final int getAndSet(int i, int newValue) {

long offset = checkedByteOffset(i);

while (true) {

int current = getRaw(offset);

if (compareAndSetRaw(offset, current, newValue))

return current;

}

}

/**

  • Atomically sets the element at position {@code i} to the given

  • updated value if the current value {@code ==} the expected value.

  • @param i the index

  • @param expect the expected value

  • @param update the new value

  • @return true if successful. False return indicates that

  • the actual value was not equal to the expected value.

*/

public final boolean compareAndSet(int i, int expect, int update) {

return compareAndSetRaw(checkedByteOffset(i), expect, update);

}

private boolean compareAndSetRaw(long offset, int expect, int update) {

return unsafe.compareAndSwapInt(array, offset, expect, update);

}

/**

  • Atomically sets the element at position {@code i} to the given

  • updated value if the current value {@code ==} the expected value.

  • May fail spuriously

  • and does not provide ordering guarantees, so is only rarely an

  • appropriate alternative to {@code compareAndSet}.

  • @param i the index

  • @param expect the expected value

  • @param update the new value

  • @return true if successful.

*/

public final boolean weakCompareAndSet(int i, int expect, int update) {

return compareAndSet(i, expect, update);

}

/**

  • Atomically increments by one the element at index {@code i}.

  • @param i the index

  • @return the previous value

*/

public final int getAndIncrement(int i) {

return getAndAdd(i, 1);

}

/**

  • Atomically decrements by one the element at index {@code i}.

  • @param i the index

  • @return the previous value

*/

public final int getAndDecrement(int i) {

return getAndAdd(i, -1);

}

/**

  • Atomically adds the given value to the element at index {@code i}.

  • @param i the index

  • @param delta the value to add

  • @return the previous value

*/

public final int getAndAdd(int i, int delta) {

long offset = checkedByteOffset(i);

while (true) {

int current = getRaw(offset);

if (compareAndSetRaw(offset, current, current + delta))

return current;

}

}

/**

  • Atomically increments by one the element at index {@code i}.

  • @param i the index

  • @return the updated value

*/

public final int incrementAndGet(int i) {

return addAndGet(i, 1);

}

/**

  • Atomically decrements by one the element at index {@code i}.

  • @param i the index

  • @return the updated value

*/

public final int decrementAndGet(int i) {

return addAndGet(i, -1);

}

/**

  • Atomically adds the given value to the element at index {@code i}.

  • @param i the index

  • @param delta the value to add

  • @return the updated value

*/

public final int addAndGet(int i, int delta) {

long offset = checkedByteOffset(i);

while (true) {

int current = getRaw(offset);

int next = current + delta;

if (compareAndSetRaw(offset, current, next))

return next;

}

}

/**

  • Returns the String representation of the current values of array.

  • @return the String representation of the current values of array

*/

public String toString() {

int iMax = array.length - 1;

if (iMax == -1)

return “[]”;

StringBuilder b = new StringBuilder();

b.append(‘[’);

for (int i = 0; ; i++) {

b.append(getRaw(byteOffset(i)));

if (i == iMax)

return b.append(‘]’).toString();

b.append(‘,’).append(’ ');

}

}

}

欢迎加笔者微信号(dingwpmz),加群探讨,笔者优质专栏目录:

1、源码分析RocketMQ专栏(40篇+)

2、源码分析Sentinel专栏(12篇+)

3、源码分析Dubbo专栏(28篇+)
4、源码分析Mybatis专栏
5、源码分析Netty专栏(18篇+)
6、源码分析JUC专栏

最后

分布式技术专题+面试解析+相关的手写和学习的笔记pdf

还有更多Java笔记分享如下:

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

欢迎加笔者微信号(dingwpmz),加群探讨,笔者优质专栏目录:

1、源码分析RocketMQ专栏(40篇+)

2、源码分析Sentinel专栏(12篇+)

3、源码分析Dubbo专栏(28篇+)
4、源码分析Mybatis专栏
5、源码分析Netty专栏(18篇+)
6、源码分析JUC专栏

最后

分布式技术专题+面试解析+相关的手写和学习的笔记pdf

还有更多Java笔记分享如下:

[外链图片转存中…(img-vY06Uchf-1715812404958)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值