Synchronized

(1)Synchronized关键字同步方法的底层原理
对于同步方法是使用修饰符上的ACC_SYNCHNIZED来完成的,不管使用哪一种,本质是对一个对象的监视器进行获取,同一个时刻只能有一个线程获取到由synchronized保护对象的监视器
(2)Synchronized关键字同步代码块的底层原理
对于synchronize同步块的实现底层使用了monitorent和monitorexit指令
(3)Synchronized锁升级分析,包括加锁解锁过程分析(偏向锁、轻量级锁、重量级锁)
偏向锁 -> 轻量级锁 -> 重量级锁
所谓偏向,就是偏袒的意思,偏向锁的初衷是在某个线程获得锁之后,消除这个线程锁重入(CAS)的开销,看起来让这个线程得到了偏护
访问Mark Word中偏向锁的标识是否设置成1,锁标识位是否为01,确认偏向状态.如果为可偏向状态,则判断当前线程ID是否为偏向线程如果偏向线程未只想当前线程,则通过cas操作竞争锁,如果竞争成功则操作Mark Word中线程ID设置为当前线程ID,如果cas偏向锁获取失败,则挂起当前偏向锁线程,偏向锁升级为轻量级锁
轻量锁
轻量级锁由偏向锁升级而来,偏向锁运行在一个线程同步块时,第二个线程加入锁竞争的时候,偏向锁就会升级为轻量级锁
线程由偏向锁升级为轻量级锁时,会先把锁的对象头MarkWord复制一份到线程的栈帧中,建立一个名为锁记录空间(Lock Record),用于存储当前Mark Word的拷贝。虚拟机使用cas操作尝试将对象的Mark Word指向Lock Record的指针,并将Lock record里的owner指针指对象的Mark Word。如果cas操作成功,则该线程拥有了对象的轻量级锁。第二个线程cas自选锁等待锁线程释放锁。如果多个线程竞争锁,轻量级锁要膨胀为重量级锁,Mark Word中存储的就是指向重量级锁(互斥量)的指针。其他等待线程进入阻塞状态
重量锁
自旋失败,很大概率 再一次自旋也是失败,因此直接升级成重量级锁,进行线程阻塞,减少cpu消耗。当锁升级为重量级锁后,未抢到锁的线程都会被阻塞,进入阻塞队列

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

weixin_43895388

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

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

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

打赏作者

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

抵扣说明:

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

余额充值