java synchronized实现机制

看了一些不错书和文章后,整理了一幅图,用来描述jvm是如何实现synchronized关键字的

其中补充几点:

  1. jvm从偏向锁->轻量级锁->重量级锁,是锁升级过程,反之是锁降级
  2. synchronized需要用到monitor对象,也就是synchronized(obj)中的obj对象,jvm会在这个对象的头信息中进行cas操作,来标记该monitor对象的锁类型(偏向、轻量级、重量级)、持有该monitor的threadId、被持有的计数等信息
  3. 由于jvm都是基于thread来判断该monitor是否可用,所以同一个thread可以多次加锁该monitor对象,也就是jvm支持可重入锁。后面每次重入,计数+1
  4. 在线程N进入全局安全点时,需要暂停持有偏向锁的线程M,并检查M是否存活,然后决策是升级锁还是降级锁,避免M在执行同步块的时候,N将锁降级为无锁,导致N和M同时执行同步块
  5. 第一个线程A获取到偏向锁,第二个线程B发现有人持有锁,会将锁降级为轻量级锁,第三线程发现B咨询等待轻量级锁,就会将锁降级为重量级锁
  6. 当有多个线程频繁竞争锁时,禁用偏向锁可以优化性能
  7. 减少持有锁的时间。长时间持有锁,容易导致锁降级为重量级锁
  8. 重量级锁利用了操作系统的互斥锁,需要从用户态到内核态进行切换,开销较大
  9. jvm线程与linux内核线程一一对应

转载于:https://my.oschina.net/u/1378920/blog/1935821

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值