关于AtomicInteger的一些见解&底层分析,springcloud高频面试题总结

  1. 只能保证一个共享变量的原子操作:当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性。

3. AtomicInteger相关源码

========================================================================================

public class AtomicInteger extends Number implements java.io.Serializable {

//…//

private static final Unsafe unsafe = Unsafe.getUnsafe();

private static final long valueOffset;

static {

try {

valueOffset = unsafe.objectFieldOffset

(AtomicInteger.class.getDeclaredField(“value”));

} catch (Exception ex) { throw new Error(ex); }

}

private volatile int value;

//…//

}

  1. 从 AtomicInteger 的内部属性可以看出,它依赖于Unsafe类获得对象内存地址访问,偏移量valueOffset代表的该变量值在内存中的偏移地址,从而获取数据的。

  2. 变量value用volatile修饰,保证了多线程之间的内存可见性,当前线程可以拿到value最新的值。

  3. CAS操作保证了AtomicInteger 可以安全的修改value 的值。

AtomicInteger 类主要利用 CAS (compare and swap) + volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。

CAS 的原理是拿期望的值和原本的一个值作比较,如果相同则更新成新的值。UnSafe 类的 objectFieldOffset() 方法是一个本地方法,这个方法是用来拿到“原来的值”的内存地址,返回值是 valueOffset。另外 value 是一个 volatile 变量,在内存中可见,因此 JVM 可以保证任何时刻任何线程总能拿到该变量的最新值。

3.1 应用场景


AtomicInteger提供原子操作来进行Integer的使用,通过线程安全的方式操作加减。

AtomicInteger是在使用非阻塞算法实现并发控制,适合一些高并发场景。

// 以原子的方式将给定发的值与当前的值进行相加,实际上就是等于线程安全版本的

// i = i + delta操作

public final int addAndGet(int delta)

// 以原子的方式将给定发的值与当前的值进行相加,实际上就是等于线程安全版本的

// j = i; i += delta;

// return j

public final int getAndAdd(int delta)

// 获取当前的值

public final int get()

请添加图片描述

// 获取当前的值,并自增,相当于线程安全版本的i++操作

public final int getAndIncrement()

// 获取当前的值,并自减,相当于线程安全版本的i–操作

public final int getAndDecrement()

// 获取当前的值,并自增,相当于线程安全版本的++i操作

public final int incrementAndGet()

// 如果输入的数值等于预期值,则以原子方式将该值设置为输入值(update)

boolean compareAndSet(int expect, int update)

//…// 方法还有很多,就不一一列举了
以上的方法都可以在这个链接找到实例–>> Java AtomicInteger 相关方法的用法及代码示例

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

读者福利

由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

更多笔记分享

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」
30B83-1712007365694)]

[外链图片转存中…(img-AONa5Rrc-1712007365694)]

[外链图片转存中…(img-rLO5f6bX-1712007365695)]

更多笔记分享

[外链图片转存中…(img-47uZq96i-1712007365695)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值