线程安全的实现之synchronized及锁升级

synchronized简介

在Java中synchronized是最基本的互斥同步手段,synchronized作为关键字是一种块结构的同步语法。
synchronized关键字经过Javac编译后会在同步块前后形成monitorenter和monitorexit这两个字节码指令。这两个指令都需要一个reference类型的参数来指明要锁定和解锁的对象。对于synchronized可以修饰对象、代码块、方法、类。
在这里插入图片描述

在执行monitorenter指令之前需要尝试获取对象锁,而执行monitorexit指令时会将锁计数器减一,一旦计数器为零则锁就随即释放,所以synchronized为可重入锁。如果当前线程获取锁对象失败则会阻塞等待直到请求锁定的对象被其持有它的线程释放。

锁升级

背景

持有锁是一个重量级操纵,阻塞或唤醒一个线程就需要操作系统帮助完成。这就涉及到用户态到内核态的转换,状态的转换消耗很多的处理器时间,这种时间消耗可能会比代码执行时间还要长。

锁优化

在JDK5升级到JDK6后对于锁进行了优化从而提高了程序的执行效率,如自适应自旋锁、轻量级锁、偏向锁等。

升级过程

互斥同步锁对性能影响最大的就是阻塞的实现与用户态到内核态的转换,自旋锁可以有效的避免了线程切换的开销。当无竞争的情况下锁对象第一次被线程获取时,虚拟机就将对象头标志位设置为偏向模式,同时使用CAS操作把获取锁的线程ID记录在对象的Mark Word中,如果CAS操作成功,那么持有偏向锁的线程每次进入锁相关的同步块时虚拟机不在进行同步操作(加锁、解锁等)。一旦出现另个线程来尝试获取锁那么偏向模式就结束。此时两个线程进行锁的争抢,虚拟机首先会检查对象的Mark Word是否指向当前线程,如果是则直接进入同步块继续执行,否则就争抢失败将进行CAS等待。如果出现两条以上的线程线程争抢同一把锁,那么轻量级锁就不在有效晋升为重量级锁。
综上所述从无锁态偏向锁轻量级锁再到重量级锁

个人见解不喜勿喷!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值