什么是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操作以提升并发的效率)等。
本文详细解析了CAS(compareandswap)的概念,它是Java乐观锁的一种实现方式,依赖于CPU的原子操作。文章对比了悲观锁与乐观锁的特性,讨论了CAS的实现原理及特点,同时指出了其可能存在的ABA问题。
5万+

被折叠的 条评论
为什么被折叠?



