Java原子操作CAS原理解析-创新互联

一、CAS(Compare And Set)

创新互联公司-专业网站定制、快速模板网站建设、高性价比铜仁网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式铜仁网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖铜仁地区。费用合理售后完善,十年实体公司更值得信赖。

Compare And Set(或Compare And Swap),CAS是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)、新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。CAS有效地说明了“我认为位置V应该包含值A;如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。

​ 在java中可以通过锁和循环CAS的方式来实现原子操作。Java中 java.util.concurrent.atomic包相关类就是 CAS的实现,atomic包里包括以下类:

AtomicBoolean可以用原子方式更新的 boolean 值。
AtomicInteger可以用原子方式更新的 int 值。
AtomicIntegerArray可以用原子方式更新其元素的 int 数组。
AtomicIntegerFieldUpdater基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原子更新。
AtomicLong可以用原子方式更新的 long 值。
AtomicLongArray可以用原子方式更新其元素的 long 数组。
AtomicLongFieldUpdater基于反射的实用工具,可以对指定类的指定 volatile long 字段进行原子更新。
AtomicMarkableReferenceAtomicMarkableReference 维护带有标记位的对象引用,可以原子方式对其进行更新。
AtomicReference可以用原子方式更新的对象引用。
AtomicReferenceArray可以用原子方式更新其元素的对象引用数组。
AtomicReferenceFieldUpdater基于反射的实用工具,可以对指定类的指定 volatile 字段进行原子更新。
AtomicStampedReferenceAtomicStampedReference 维护带有整数“标志”的对象引用,可以用原子方式对其进行更新。

二、AtomicInteger

AtomicInteger可以用原子方式更新的 int 值。AtomicInteger 可用在应用程序中(如以原子方式增加的计数器),并且不能用于替换 Integer。但是,此类确实扩展了 Number,允许那些处理基于数字类的工具和实用工具进行统一访问。 我们拿 AtomicInteger为例来学习下 CAS操作是如何实现的。

通常情况下,在 Java中,i++等类似操作并不是线程安全的,因为 i++可分为三个独立的操作:获取变量当前值,为该值+1,然后写回新的值。在没有额外资源可以利用的情况下,只能使用加锁才能保证读-改-写这三个操作时“原子性”的。但是利用加锁的方式来实现该功能的话,代码将非常复杂及难以维护,如:

synchronized (lock) { 
  i++; 
}

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章标题:Java原子操作CAS原理解析-创新互联
文章位置:http://ybzwz.com/article/piosh.html