竹笋

首页 » 问答 » 常识 » JDK成长记17Atomic类的原理C
TUhjnbcbe - 2023/4/6 9:06:00
北京皮肤病医院那家好 https://m-mip.39.net/czk/mipso_4652392.html
文章配图

经过volatil和synchroniz关键字的底层原理的洗礼,不知道你是否有一种感觉,要想弄明白它们的原理是一个非常难的过程。为什么费这么大的力气要弄明白这些并发基础知识呢?

其实是为了之后更好的掌握并发组件、并发集合这些内容。JDK中的juc(并发包)的知识大体可以分为如下几块:

文章配图

并发基础中除了volatil、synchronid、线程状态变化之外,还有很重要的两个知识CAS和AQS。而其他并发组件和集合都是基于这些知识来实现的工具而已。

这一节我们通过Atomic类来学习下它的底层原理,实际它的底层通过CAS+volatil的原理来实现的。我们来具体看看:

JDK中的CAS如何实现的?又是如何应用在Atomic中的?CAS的自旋性能问题怎么优化?CAS的ABA问题怎么解决?

在Java代码中,CAS是如何应用在Atomic中的?

在Java代码中,CAS是如何应用在Atomic中的?

之前学习synchronizd的时候,就接触过CAS。CAS一般称作CompaAndSwap操作。操作流程如下:

文章配图

上面CAS操作简单描述可以如下:当更新一个值从E-V时,更新的时候需要读取E最新的值N,如果发生了变化,也就是当E!=N,就不会更新成功,重新尝试,否则更新值成功,变为V。

来看一个Dmo:

privatstaticAtomicIntgrj=nwAtomicIntgr(0);publicstaticvoidmain(String[]args){for(inti=0;i10;i++){nwThad(()-{Systm.out.println(AtomicIntgrDmo.j.incmntAndGt());}).start();}}

这段程序有10个线程,它们可能同时更新J的值。但是输出结果是按顺序输出了0到10的数字。这是因为在AtomicIntgr底层,每个线程的更新都是CAS操作,它保证了多线程修改同一个值的原子性。

首先你可以先看一下AtomicIntgr整体脉络:

文章配图

根据之前分析源码的思想,先脉络后细节,你应该可以看出,它核心脉络就是一个Unsaf对象,int的valu。如下

publicclassAtomicIntgrxtndsNumbrimplmntsjava.io.Srializabl{//stuptousUnsaf.

1
查看完整版本: JDK成长记17Atomic类的原理C