CAS原理以及CAS带来的三大问题

CAS原理以及CAS带来的三大问题,第1张

参考: https://www.jianshu.com/p/ab2c8fce878b

https://www.jianshu.com/p/68f9cd012de8

CAS :Compare and Swap,即比较再交换。

CAS算法理解 :CAS是一种无锁算法,CAS有3个 *** 作数,内存值E,旧的预期值V,要修改的新值N。当且仅当预期值V和内存值E相同时,将内存值E修改为N,否则什么都不做。

CAS算法图解

上图描述了CAS的原理,以及带来的三大问题以及问题出现的位置。

1.ABA问题

因为CAS需要在 *** 作值的时候,检查值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么CAS进行检查的时候发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面加上版本号,每次变量更新的时候把版本号加1,那么A->B->A就会变成1A->2B->3A。从Java 1.5开始,JDK的Atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法的作用是首先检查当前引用是否等于预期引用,并且检查当前的标志是否等于预期标志,如果全部相等,则以原子方式将该应用和该标志的值设置为给定的更新值。

2.循环时间长开销大

自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销,如果JVM能支持处理器提供的pause指令,那么效率会有一定的提升。pause指令有两个作用:第一,它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零;第二,它可以避免在循环的时候因内存顺序冲突(Memory Order Violation)而引起CPU流水线被清空,从而提高CPU的实行效率。

3.只能保证一个共享变量的原子 *** 作

当对一个共享变量执行 *** 作时,我们可以使用循环CAS的方式来保证原子 *** 作,但是对多个共享变量 *** 作时,循环CAS就无法保证 *** 作的原子性,这个时候可以用锁。还有一个取巧的办法,就是把多个共享变量合并成一个共享变量来 *** 作。比如,有两个共享变量i=2,j=a,合并一下ji=2a,然后用CAS来 *** 作ij。从Java 1.5开始,JDK提供了AtomicReference类来保证引用对象之前的原子性,就可以把多个变量放在一个对象里来进行CAS *** 作。

Cas机制原理,简单来说是使用一个期望值来和当前变量的值进行比较,如果当前的变量值与我们期望的值相等,就用一个新的值来更新当前变量的值。

CAS有三个 *** 作数:内存值V、旧的预期值A、要修改的值B,当且仅当预期值A和内存值V相同时(条件),将内存值修改为B并返回true,否则条件不符合返回false。条件不符合说明该变量已经被其它线程更新。

cas优点:如一描述在并发量不是很高时cas机制会提高效率。

cas缺点:循环时间开销太大:如果CAS长时间执行不成功,则会给CPU带来交大的执行开销。处理器提供一种pause指令可以缓解这部分问题,pause指令有两个作用,第一它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零。第二它可以避免在退出循环的时候因内存顺序冲突(memory order violation)而引起CPU流水线被清空(CPU pipeline flush),从而提高CPU的执行效率。

只能保证一个共享变量的原 *** 作。如果需要对多个共享变量进行同步,就得使用锁,或者将几个共享变量封装起来,使用CAS来进行同步。从Java1.5开始JDK提供了AtomicReference类来保证引用对象之间的原性,你可以把多个变量放在一个对象里来进行CAS *** 作。

http://www.cnreagent.com/source/alibaba.php 用这个查,可以用物质的分子式,中文名,英文名和CAS号进行互查.还支持模糊查询,很好用的。

1.查询CAS登记号,中文名、英文名及其别名,分子量、分子式,熔点、沸点,部分有性质介绍。

2.可以输入中文名称、英文名称、CAS编号或者分子式进行查询。

3.部分记录有多个中文名称和多个英文名称。

4.关键词、字的前后顺序会影响检索结果,例如在中文名称中检索“胺 乙基”和“乙基 胺”,检索结果会不同: 检索“胺 乙基”时,会检索到二乙胺基乙基纤维素,但不会检索出四乙基乙二胺。 检索“乙基 胺”时,会检索到四乙基乙二胺,但不会检索出二乙胺基乙基纤维素。

5.使用CAS编号查询时需输入完整的CAS编号,包括"-",如“100-00-5”。

【拓展资料】

一、CAS号是什么?

1.cas编号的中文全称为“化学物质登录号”,由一组数字组成。就像我们都有自己唯一的身份z一样,每一种已经发现的化合物都有自己唯一对应的编号。 2.这种编号的出现,可以弥补化学物质命名不统一而引起的种种麻烦。比如对于同一物质,各个国家的命名方法不同,有很多物质既有化学名称,又有俗名。 3.这样一来,经常发生数据不全的现象。而cas编号唯一对应一种物质,很容易解决这个问题。只要知道这个物质的cas编号,就可以很快,很轻松地查询最全面的资料。 4.下面简单说一下cas编码的组成。由六位到九位的数字组成。其一般形式为【####aa-aa-a】。其中#表示可有可无的数字,a表示必须有的数字。也就是说最前面的数字位数是不一定的,有些物质是两位,最多可达六位。然而无论是什么化合物,必需至少有五位数组成。在原则上,数字大小可以反映物质发现的早晚,数字越大,表示发现得越晚。现在已有2000万余种物质有自己的cas编号。 5.cas编号最早出现于美国化学摘要服务社(chemical abstracts service,CAS即为该服务社的缩写)出版的《化学摘要》,与其同时研发的网上检索系统,后来凭借无比的优越性,其他出版社也采用cas编码来标明化学物质,现在海关化学物品进出口,也要登录该资料。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9944648.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存