标签:场景 put 假设 乐观锁 san weight 相同 大量 工具
CAS无锁机制原理,面试高频问题之一,其实,日常开发中并不会直接使用CAS无锁机制,都是通过一系列封装好的工具类来使用,
说不定面试官不提问,都不知道有这么个东西存在。
参考回答:
通常我们提到保证多线程安全,会想到三种方式,一是使用Synchronize关键字,但是有个问题就是,使用了Synchronize加锁后的多线程相当于串行,执行效率并不是太高,所以在高并发场景下,使用第二种方式Lock锁,Lock锁要比使用Synchronize关键字在性能上有极大的提高,其实Lock锁底层就是通过AQS+CAS机制实现的;第三种方式就是使用Java并发包下的Atomic「e淘米客」原子操作类,使用了原子类后就不需要使用Synchronize关键字或者是Lock加锁也是线程安全的,原子类的底层就是基于CAS无锁算法实现的。
CAS 比较后再交换。CAS有三个操作数,旧值A,新值B,以及需要读取的内存值V,在更新一个变量时,当且仅当A=V相同时,CAS才会将内存值V修改为B,否则什么都不做。
参考回答有点啰嗦了,提到了CAS的应用场景原子类的使用,但多说点显得有丶东西
参考回答
Java里的CAS是通过调用Unsafe「安sei夫」类的native方法,再由C调用CPU底层命令实现的。
如果问到Unsafe?
Unsafe 这个类是 JDK 提供的一个比较底层的类,是一个不安全的类,官方不建议开发者使用的,为啥呢?①Unsafe在未来可能被移除,也就是高版本jdk可能无法运行;②Unsafe中不少方法中必须提供内存地址和被替换对象的地址,中间会有一些计算问题,一旦出现问题就会导致jvm实例崩溃;③Unsafe中提供的直接访问内存的方法不受jvm管理,需要手动操作,如果疏忽可能会触发内存泄漏;
Unsafe通常用来:「额外补充,了解即可」
如果你想了解加深CAS原理,那么可以敲出一个原子类变量,比如AtomicInteger,直接看一下他的源码,找一下Unsafe是怎么大量应用的。
缺点
*优点
在一般情况下,性能优先于锁的使用。
从思想上来说,Synchronized属于悲观锁,悲观地认为程序中的并发情况严重,所以严防死守。
CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新。
CAS和Synchronized没有绝对的好与坏,关键看使用场景。在并发量非常高的情况下,反而用同步锁更合适一些。
标签:场景 put 假设 乐观锁 san weight 相同 大量 工具
原文地址:https://www.cnblogs.com/niceyoo/p/12683341.html