关闭

漫画:什么是 CAS 机制?

1579人阅读 评论(6) 收藏 举报


点击上方“程序员小灰”,选择“置顶公众号”

有趣有内涵的文章第一时间送达!







—————  第二天  —————




















————————————











示例程序:启动两个线程,每个线程中让静态变量count循环累加100次。




最终输出的count结果是什么呢?一定会是200吗?








加了同步锁之后,count自增的操作变成了原子性操作,所以最终的输出一定是count=200,代码实现了线程安全。





为什么这么说呢?关键在于性能问题。


Synchronized关键字会让没有得到锁资源的线程进入BLOCKED状态,而后在争夺到锁资源后恢复为RUNNABLE状态,这个过程中涉及到操作系统用户模式内核模式的转换,代价比较高。


尽管Java1.6为Synchronized做了优化,增加了从偏向锁轻量级锁再到重量级锁的过度,但是在最终转变为重量级锁之后,性能仍然较低。







所谓原子操作类,指的是java.util.concurrent.atomic包下,一系列以Atomic开头的包装类。例如AtomicBooleanAtomicIntegerAtomicLong。它们分别用于Boolean,Integer,Long类型的原子性操作。


现在我们尝试在代码中引入AtomicInteger类:



使用AtomicInteger之后,最终的输出结果同样可以保证是200。并且在某些情况下,代码的性能会比Synchronized更好







什么是CAS?


CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。


CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。


更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。


这样说或许有些抽象,我们来看一个例子:



1.在内存地址V当中,存储着值为10的变量。





2.此时线程1想要把变量的值增加1。对线程1来说,旧的预期值A=10,要修改的新值B=11。





3.在线程1要提交更新之前,另一个线程2抢先一步,把内存地址V中的变量值率先更新成了11。





4.线程1开始提交更新,首先进行A和地址V的实际值比较(Compare),发现A不等于V的实际值,提交失败。





5.线程1重新获取内存地址V的当前值,并重新计算想要修改的新值。此时对线程1来说,A=11,B=12。这个重新尝试的过程被称为自旋




6.这一次比较幸运,没有其他线程改变地址V的值。线程1进行Compare,发现A和地址V的实际值是相等的。





7.线程1进行SWAP,把地址V的值替换为B,也就是12。




从思想上来说,Synchronized属于悲观锁,悲观地认为程序中的并发情况严重,所以严防死守。CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新。

















CAS的缺点:


1.CPU开销较大

在并发量比较高的情况下,如果许多线程反复尝试更新某一个变量,却又一直更新不成功,循环往复,会给CPU带来很大的压力。


2.不能保证代码块的原子性

CAS机制所保证的只是一个变量的原子性操作,而不能保证整个代码块的原子性。比如需要保证3个变量共同进行原子性的更新,就不得不使用Synchronized了。


3.ABA问题

这是CAS机制最大的问题所在。

什么是ABA问题?怎么解决?我们下一期来详细介绍。




几点补充:


本漫画纯属娱乐,还请大家尽量珍惜当下的工作,切勿模仿小灰的行为哦。




—————END—————




喜欢本文的朋友们,欢迎长按下图关注订阅号程序员小灰,收看更多精彩内容



8
0
查看评论

CAS原理分析

一、锁机制 常用的锁机制有两种: 1、悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。悲观锁的实现,往往依靠底层提供的锁机制;悲观锁会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。 2、乐观锁:假设不会发生并发冲突,每次不加锁而是假设没有冲突而去完成某项操作,只在提交操...
  • HEYUTAO007
  • HEYUTAO007
  • 2014-02-26 14:03
  • 7651

JAVA CAS原理深度分析

看了一堆文章,终于把JAVA CAS的原理深入分析清楚了。 感谢GOOGLE强大的搜索,借此挖苦下百度,依靠百度什么都学习不到!   参考文档: http://www.blogjava.net/xylz/archive/2010/07/04/325206.html http://...
  • Hsuxu
  • Hsuxu
  • 2013-07-25 13:07
  • 117664

什么是 CAS 机制?

CAS机制的简单介绍
  • zhangjq520
  • zhangjq520
  • 2018-01-02 15:18
  • 116

Java的CAS机制

http://blog.csdn.net/hsuxu/article/details/9467651
  • yyd19921214
  • yyd19921214
  • 2016-01-28 15:57
  • 211

CAS原理

企业的信息化过程是一个循序渐进的过程,在企业各个业务网站逐步建设的过程中,根据各种业务信息水平的需要构建了相应的应用系统,由于这些应用系统一般是 在不同的时期开发完成的,各应用系统由于功能侧重、设计方法和开发技术都有所不同,也就形成了各自独立的用户库和用户认证体系。随着新的业务网站不断的增 加,用户...
  • yuan1013922969
  • yuan1013922969
  • 2016-06-13 10:28
  • 1504

CAS简介

一、SSO介绍          SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。CAS = Central Authentication Service,中央认证...
  • jly4758
  • jly4758
  • 2015-06-28 20:32
  • 810

Memcached的CAS机制的实现

转载自:http://1.simpcl.sinaapp.com/?p=1 CAS,又称Compare-and-Swap,代表一种原子操作。 Memcached的CAS机制解决的问题及其原理: 1. 实现了Check-and-Set原子操作功能; 2. 其使用方式为:首先使用get...
  • tenfyguo
  • tenfyguo
  • 2012-12-31 18:50
  • 8819

漫画:什么是CAS机制?(进阶篇)

点击上方“程序员小灰”,选择“置顶公众号”有趣有内涵的文章第一时间送达!上一期为大家讲解的CAS机制的基本概念,没看过的小伙伴们可以点击下面的链接:漫画:什么是 CAS 机制?这一期我们来深入介绍之前遗留的两个问题:Java当中CAS的底层实现CAS的ABA问题和解决方法首先看一看AtomicInt...
  • bjweimengshu
  • bjweimengshu
  • 2018-01-08 00:00
  • 340

Memcached的CAS机制的实现

转载自:http://1.simpcl.sinaapp.com/?p=1 CAS,又称Compare-and-Swap,代表一种原子操作。 Memcached的CAS机制解决的问题及其原理: 1. 实现了Check-and-Set原子操作功能; 2. 其使用方式为:首先使用gets指令...
  • z69183787
  • z69183787
  • 2016-10-25 11:35
  • 487

浅谈CAS机制

这里只是浅谈一下CAS机制,有机会的话后续会深入 CAS 背景 机制 为什么具有原子性 缺点 ABA问题 ABA问题的解决方案 CAS 背景 尽管Java1.6为Synchronized做了优化,增加了从偏向锁到轻量级锁再到重量级锁的过度,但是在最...
  • nakiri_arisu
  • nakiri_arisu
  • 2018-01-29 12:31
  • 18
    个人资料
    • 访问:84304次
    • 积分:1073
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:103篇
    • 译文:0篇
    • 评论:73条
    文章分类
    最新评论