乐观锁、悲观锁、自旋锁、Synchronized 同步锁

乐观锁、悲观锁、自旋锁、Synchronized 同步锁

乐观锁

乐观锁是一种乐观思想,即认为读多写少,遇到并发的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读取当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新)

java中的乐观锁基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。

悲观锁

悲观锁就是一种悲观思想,即认为写多读少,遇到并发的可能性高,每次去拿数据都会认为数据被别人修改了,所以每次都需要加锁,这样别人想读写这个数据就会block知道拿到锁,java中的悲观锁就是Synchronized。

自旋锁

自旋锁的原理非常简单,如果持有锁的线程能在很短的时间内释放资源,那么等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,他们只需要等一等(自旋)等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换消耗

线程自旋是需要消耗cpu的,说白了就是CPU在做无用功,如果一直获取不到锁,那线程
也不能一直占用cup 自旋做无用功,所以需要设定一个自旋等待的最大时间。

如果持有锁的线程执行的时间超过自旋等待的最大时间扔没有释放锁,就会导致其它争用锁
的线程在最大等待时间内还是获取不到锁,这时争用线程会停止自旋进入阻塞状态。

Synchronized 同步锁

Synchronized 他可以把任意一个非NULL的对象当做锁,它属于独占式的悲观锁,同时属于可重入锁
Synchronized 作用范围
作用方法时,锁住的是对象的实例(this)
作用于静态方法时,锁住的是Class实例
作用于对象时,锁住的是以该对象为锁的代码块

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_子栖_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值