关于乐观锁、悲观锁,自旋锁的总结

一.乐观锁

乐观锁是一种乐观的思想:
(1)他认为是一种读多写少的情况
(2)他认为并发量不是很大
(3)所以他在每次读取数据的时候都不上锁
(4)在他写数据的时候,他遵循读-比较-写的过程,比较是很上一个版本号的数据进行比较,只有比较结果相同的时候,他才会进行数据的更新。
(5)在Java里面,乐观锁通常是通过CAS实现的,CAS是一个比较写值与当前值的,当写入值与当前值相等的时候才会进行数据写入的更新原子操作。

二.悲观锁

悲观锁是一种悲观的思想:
(1)他认为是一种写多读少的情况。
(2)他认为并发量很大
(3)所以他在每次读写数据的时候都需要加上锁,别人想读取这个数据的时候,必须先拿到锁。
(4)java中的悲观锁就是通过synchronized来实现的,在AQS框架下,都是先通过CAS尝试获取乐观锁资源然,获取不到,然后转换为悲观锁。

三.自旋锁

(1)自旋锁的原理:当持有锁资源的线程会在很短的时间内释放掉所资源的时候,竞争等待的锁资源的线程只需要等一等,自旋一下,等资源释放,就可以获取到锁,这样做的目的是减少线程状态和内核状态切换造成的消耗。直白点就是让CPU在短时间内做无用功。
(2)优点:减少了线程之间状态的切换和内核状态的切换带来的资源的消耗。
缺点:就是如果是线程会长时间的持有锁资源,那就就不适合用自旋锁了,因为那会造成CPU长时间的在无用功,浪费资源,又或者说并发的数量很高的情况下,也不适合使用自旋锁。
(3)为了避免严重超时的问题,引入了自旋超时阀值,自旋锁的目的是为了占着 CPU 的资源不释放,等到获取到锁立即进行处理。但是如何去选择自旋的执行时间呢?如果自旋执行时间太长,会有大量的线程处于自旋状态占用 CPU 资源,进而=会影响整体系统的性能。因此自旋的周期选的额外重要
(4)不同版本的JDK对自旋锁的开启不一样,JDK1.7后,已经取消了自旋锁的开关,将自旋锁交个JVM来处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值