(一)Synchronized锁升级的大致过程

(一)Synchronized锁升级的大致过程(参考马士兵老师)

(二)Synchronized以前为什么被称为重量级锁

因为Synchronized是跑在JVM上,JVM对于操作系统的内核来说,就是一个普通的应用程序,Synchronized想要申请一把锁,需要交给BOSS(操作系统内核态)来做,做好后反馈给你,所以叫重量级所

(三)Synchronized升级后

在这里插入图片描述

- 其中的偏向锁和轻量级锁是在用户态完成的,不需要经过BOSS(操作系统内核)
- 重量级锁是需要让BOSS帮我管理多线程

  1. 偏向锁
    自己直接把ID往上一贴就可以,偏向第一个持有这个锁的线程,基本上就一个锁,没有锁的竞争。比如JDK中的Vector和StringBuffer,他们两个特点就是线程安全,因为内部加锁了。

  2. 把ID往上一贴就可以什么意思?
    说白了就是改变对象的markwork,将自己的名字贴到markwork上

  3. 轻量级锁
    也就是我们所说的自旋锁(CAS----compare and set 比较并设置),偏向锁一开始没有竞争,后来线程多了之后,开始竞争,把原来的ID撕下来,以CAS的方式开始竞争,抢着贴自己的ID,谁贴成功了,锁就算谁的;不成功的就自旋,自旋就是循环检查有没有线程持有这个锁,如果没有就上自己的锁。自旋锁适合于线程少或者一个线程占用时间少的多线程,因为自旋是不断进行While循环,消耗CPU

  4. 重量级锁 自旋锁竞争越来越激烈,消耗大量CPU,就需要BOSS(操作系统内核)。Boss怎样管理呢?
    排队!都不要自旋了。把没有抢到锁的线程扔到队列里等待(wait()操作),什么时候锁让出来了,这时候分两种情况

      - 公平锁,操作系统使多个线程按照申请锁的顺序去获得锁,永远都是队列的第一位才能得到锁。
    
      - 非公平锁,队列里面线程一起去抢,谁抢到算谁的
    
  5. 怎样区分锁的状态,根据markwork的***锁标志位和偏向锁位***
    在这里插入图片描述
    锁标志位00-----轻量级锁 (或自旋锁或无锁 无锁就是自旋锁)
    锁标志位01-----两种情况(下面)
    锁标志位10-----重量级锁
    锁标志位11------GC标记信息,被回收

    若是01------代表两种情况,再看偏向锁位
    偏向锁位0-------无锁态
    偏向锁位1--------偏向锁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值