java并发中的CAS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hzt_fighting_up/article/details/78633871

CAS(Compare And Swap)简单介绍
CAS实现原子方式操作。java中锁可以分为两大类,乐观锁和悲观锁。乐观锁不是指哪种锁,而是一种实现线程安全的不加锁策略。而CAS实现了这个策略,先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果共享数据有争用,产生冲突,则采取其他的补偿措施,这个措施一般是不断调用那个方法,或者放弃调用
CAS执行函数:
CAS(V,E,N)
V:内存的值
E:预期值
N:更新的值
如果V值等于E值,则将V的值设为N。若V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做

CPU指令对CAS支持
假设存在多个线程执行CAS操作并且CAS的步骤很多,有没有可能在判断V和E相同后,正要赋值时,切换了线程,更改了值。造成了数据不一致呢?答案是否定的,因为CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致问题。

Unsafe类
CAS操作底层是通过调用unsafe类来完成的
Unsafe类中的所有方法都是native修饰的,说明Unsafe类中的方法都是直接调用操作系统底层资源执行任务的。

猜你喜欢

转载自blog.csdn.net/Hzt_fighting_up/article/details/78633871