文档章节

CAS

小胖子编程
 小胖子编程
发布于 2017/08/30 22:55
字数 858
阅读 10
收藏 0

之前讲锁的实现的时候讲到了CAS,但没有详细的讲述CAS是什么,只是说明了CAS能保证原子性,那么原子性是什么?CAS到底又是什么呢?

对于原子性、可见性、有序性可以自行学习,如果有时间,可以单开一篇讲述。

在讲CAS之前,我们先来想想,在多线程下,Java如何保证同步,首先会想到的就是synchronized关键字 但是众所周知,synchronized是一个重量级的关键字,它会导致有锁,导致性能不高。 而volatile只能保证可见性,并不能保证原子性。(volatile的相关知识可自行学习) 那么为了保证同步,锁机制是必然需要的。 synchronized是一种独占锁,也是一种悲观锁,他相信一定有线程去修改他,那么他要让其他线程挂起等待,直到锁被释放,这样的效率是较低的。 那么相对的,乐观锁的效率会更高一些,所谓乐观锁,就是相信没有其他线程去修改他(如果修改失败了,继续重试,直到成功)。

CAS:Compare And Swap CAS指的是现代CPU广泛支持的一种对内存中的共享数据进行操作的特殊指令。 简单讲一下这个指令的操作过程:首先CPU会将内存中需要被更改的数据与期望值进行对比。当两个值相等时,CPU才会将值替换成新的值,否则认为更改失败,不做任何操作。这一系列的操作是原子的。 简单的说,CAS指令有三个参数,内存值V,旧的预期值A,新的修改的值B,当且仅当内存值V和旧的预期值A相同时,内存值V才会修改成B。

CAS会带来一个著名的ABA问题 1.进程P1在共享变量中读到值为A 2.P1被抢占了,进程P2执行 3.P2把共享变量里的值从A改成了B,再改回到A,此时被P1抢占。 4.P1回来看到共享变量里的值没有被改变,于是继续执行。 尽管CAS还是会成功执行,但是这样会带来隐藏的问题。

例如现在有一个队列A->B->C,此时head=A, 通过CAS操作将A替换成B,此时进程P1在内存的共享变量中读到值为A 在这个时候进程P1被抢占了,进程P2执行 P2把A,B,C三个值都pop掉,再将A,C,D三个值push进来,此时队列变成了A->C->D,但是head仍为A,此时被P1抢占 P1回来看到共享变量里面的值没有被改变,于是继续执行,此时head就变成了B,此时B.next = null, 队列里就只剩下了B,丢失了C、D两个值。 对于ABA问题,一般的解决方案是加上版本号来区分是否真的没有被修改过,在Java中AtomicStampedReference<E>也实现了这个作用,有兴趣的可以了解一下,其实质是将共享变量和版本号包装成一个对象来进行CAS操作, 每次CAS传入共享变量和版本号的旧值和新值,来判断共享变量是否真的没有被改变过。

© 著作权归作者所有

共有 人打赏支持
小胖子编程
粉丝 1
博文 9
码字总数 9126
作品 0
绍兴

暂无文章

文件的压缩与解压(linux)

Linux下*.tar.gz文件解压缩命令 1.压缩命令:   命令格式:tar -zcvf 压缩后文件名.tar.gz 被压缩文件名 可先切换到当前目录下。压缩文件名和被压缩文件名都可加入路径。 2.解压缩命令: ...

qimh
28分钟前
1
0
invalid character found in the request target 异常

这个异常时因为Tomcat 9不支持请求格式出现“{”等非法字符的问题 因为tomcat版本问题遇到的坑,记录一下。 问题 今天由于要测试一下订单详情页的异步查询,在本地起了一个服务,发送的请求是...

edwardGe
33分钟前
3
0
发现抓包软件fiddler的bug

1个请求他跳转之后,直接400,被拦在了Apache,使用fiddler 的,replay requests 是同样的结果,但是replay composer确是正常的。 也就是说这replay requests 是发原来的包,replay composer...

NLGBZJ
43分钟前
1
0
linux screen 命令详解

shell关闭后, 主机仍然运行 screen命令 启动jenkins以后, screen, 然后按ctrl+a 再按d 这样暂停了子界面, 这时候回到了父界面 用screen –ls查看目前子界面的状态 [root@free /]# screen -l...

SuShine
44分钟前
2
0
mac机器切换无线网络导致网页不能打开的问题

问题: 公司和家里使用不同的WI-FI,每次从家到公司时自动切换网络后,公司的许多地址不能访问, ping域名是可以ping同的,但是网页却打不开... 问题分析: 初步猜想是DNS缓存的问题? 对于MAC系统没...

Lennie002
46分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部