java乐观锁的一种实现CAS

本文详细解析了CAS(compareandswap)的概念,它是Java乐观锁的一种实现方式,依赖于CPU的原子操作。文章对比了悲观锁与乐观锁的特性,讨论了CAS的实现原理及特点,同时指出了其可能存在的ABA问题。

什么是CAS

CAS:compare and swap,即比较并交换。CAS即java乐观锁的一种实现,CAS依靠的是CPU来实现的(java中的CAS类内部实现属于native方法,由JVM本地实现),属于硬件级别的操作。

锁的分类

悲观锁(例如互斥同步):synchronized是独占锁即悲观锁,会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。

乐观锁:每次不加锁而是假设没有冲突而去完成某种动作,如果因为冲突失败就不断重试,直到成功为止。

注:悲观锁每次都要进行加锁,无论是否会出现竞争。而java的线程是映射到操作系统的原生线程之上的,如果要阻塞或唤醒一个线程,都需要操作系统来帮忙完成,这就需要从用户态转换到核心态中,因此状态转换需要耗费很多的处理器时间。而乐观锁不会让线程进行阻塞,而是不断的去尝试完成某种动作,开销比悲观锁小,不过安全性不如悲观锁,因此仅必要情况使用synchronized。

乐观锁CAS的实现

有三个值:一个当前内存值V、旧的预期值A、将更新的值B。先获取到内存当中当前的内存值V,再将内存值V和原值A作比较,要是相等就修改为要修改的值B并返回true,否则什么都不做,并返回false。
注:前后获取值相同,判断没有线程在对该值进行写操作,判断没有冲突。

CAS的特点

CAS是一组原子操作,不会被外部打断。CAS属于硬件级别的操作(利用CPU的CAS指令,同时借助JNI来完成的非阻塞算法),效率比加锁操作高。

CAS的问题

ABA问题:如果变量V初次读取的时候是A,并且在准备赋值的时候检查到它任然是A,那能说明它的值没有被其它线程修改过了吗?如果在这段期间曾经被改成B,然后又改回A,那CAS操作就会误认为它从来没有被修改过。

java中的CAS类

类AtomicInteger、类AbstractQueuedSynchronizer(JUC中非常重要的一个类,作为JAVA中多种锁实现的父类,其中有很多地方使用到了CAS操作以提升并发的效率)等。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值