文档章节

CAS

小胖子编程
 小胖子编程
发布于 2017/08/30 22:55
字数 858
阅读 13
收藏 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
绍兴
私信 提问

暂无文章

day27:expect批量杀进程|

1、linux下当前目录有一个文件ip-pwd.ini,内容如下: [root@localhost_002 shell100]# cat ip-pwd.ini 10.111.11.1,root,xyxyxy10.111.11.2,root,xzxzxz10.111.11.3,root,12345610.......

芬野de博客
48分钟前
2
0
分布式之数据库和缓存双写一致性方案解析(二)

引言 该文是对《分布式之数据库和缓存双写一致性方案解析》,一文的补充。博主在该文中,提到了这么一句话 应该没人问我,为什么没有先更新缓存,再更新数据库这种策略。 博主当时觉得,这种...

hensemlee
53分钟前
3
0
druid安装与案例

druid 可以运行在单机环境下,也可以运行在集群环境下。简单起见,我们先从单机环境着手学习。 环境要求 java7 或者更高版本 linux, macOS或者其他unix系统(不支持windows系统) 8G内存 2核C...

hblt-j
59分钟前
0
0
bejson上线 gif转帧工具。

说道这个工具,不得不提一句经典格言“色Q是推动科技发展的动力” 有人发了这个图,我和所有人一样想看到那个瞬间。 当然,我没有PS,有没有太好的转帧工具,但是这并不妨碍我是一个技术死肥...

废柴大叔
今天
0
0
详解利用clear清除浮动的一些问题解决

下面这段代码是用来清除浮动带来的高度塌陷问题 .clearfix:before { content: "."; display: block; height: 0; clear: both; visibility: hidden;} Quest......

前端小攻略
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部