A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庭院深深深几许 金牌黑马   /  2019-4-18 15:26  /  1004 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是CAS?
CAS意指compare and swap,即比较并交换。它代表在java中一类方法,原子的实现数据交换并且判断数据内容是否符合预期。
通常有三个参数,需要交换的对象A,我们预期对象A的值为B,即将交换的A的值C,在单线程中我们只需要如下代码即可:
1

2

3

4

5

6

Object a;//最初的对象
Object b;//预期a的值
Object c;//最终a的值
if(a==b){
    a = c;
}

但在多线程中,上面的代码会出现严重的问题,如果线程1经判断a==b,准备执行a=c时,cpu切换到线程2,且将a改成了d,
当cpu重新切换到线程1,此时a已经不等于b了,也即是执行a=c的前提条件已经不满足;
因此我们需要对上面的操作原子的进行,当然我们可以对程序块加锁实现,这里我们讨论另一种实现方法,即使用Unsafe类CAS方法
Unsafe类?
这是sun.misc包中一个类,这并不是一个正常的类,没有办法使用正常的new Unsafe()来创建对象,其虽然提供了静态的getUnsafe方法,但仍然无法使用,调用时会报java.lang.SecurityException: Unsafe的错误。当然我们可以通过反射去绕过限制,但除非必要在正式项目中最好不要使用,拿来探究jvm确实是很有用的类。



传智Java培训拥有6大课程优势——http://www.itcast.cn/javaee/
①独有的一站式IT职业教育体系,让学员通过6个月的线下学习实现高起点就业, 12个月的线上在职进阶课实现升职加薪,大幅提升学员的职场晋升速度。
②60+套技术解决方案,覆盖职场常见开发问题,让学员就业后快速上手开发难题,轻松成为核心员工。
③超大项目库,覆盖7大就业主流热门行业,让学员边学习边积累项目开发经验。
④超千人投入的3大课程研发库,每年耗资千万打造领先行业的优质课程。
⑤传智&华为课程共建,持续为课程输出前沿技术。
⑥120+超强师资团队,多为总监、架构师出身,除了专业技能,还为你规划适合你的职业发展路线。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马