多线程锁的四种状态

转:http://mini.eastday.com/bdmip/180518175233412.html

锁一共有4种状态,级别从低到高依次是:无锁,偏向锁,轻量级锁,重量级锁。锁只能逐一升级,不能降级。重量级锁

重量锁又被称为监视器锁,每个对象有一个监视器锁,当监视器锁被占用时就会处于锁定状态,其它线程必须等待当前线程执行完毕后,才可以竞争获取监视器锁,监视器锁是互斥锁。 监视器锁本质是依赖于底层操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间。 被synchronized修饰的代码块在被编译成字节码的时候 会在该代码块开始和结束的时候插入monitorenter 和 moniterexist指令 以下为虚拟机执行两个指令是的逻辑

轻量级锁

Java SE 1.6 为了减少获得/释放锁带来的性能消耗,引入了“轻量级锁”和“偏向锁”,“轻量级”是相对于使用操作系统互斥量来实现的传统锁而言的。但是,首先需要强调一点的是,轻量级锁并不是用来代替重量级锁的,它的本意是在没有多线程竞争的前提下,减少传统的重量级锁使用产生的性能消耗。在解释轻量级锁的执行过程之前,先明白一点,轻量级锁所适应的场景是线程交替执行同步块的情况,如果存在同一时间访问同一锁的情况,就会导致轻量级锁膨胀为重量级锁。

偏向锁

HotSpot作者发现,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得。当一个线程访问同步块并获得锁时,会在对象头和栈帧中的锁记录里面存储偏向的线程ID,以后该线程再进入和退出同步块时不需要进行CAS操作来加锁和解锁。

总结

锁 优点 缺点 适用场景 偏向锁 加锁和解锁不需要额外的消耗,和执行非同步方法比仅存在纳秒级的差距。 如果线程间存在锁竞争,会带来额外的锁撤销的消耗。 适用于只有一个线程访问同步块场景。 轻量级锁 竞争的线程不会阻塞,提高了程序的响应速度。 如果始终得不到锁竞争的线程使用自旋会消耗CPU。 追求响应时间。 同步块执行速度非常快。 重量级锁 线程竞争不使用自旋,不会消耗CPU。 线程阻塞,响应时间缓慢。 追求吞吐量。 同步块执行速度较长。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值