synchronized锁升级优化过程

如果一开始是无锁状态,那么第一个线程获取索取锁的时候,判断是不是无锁状态,如果是无锁(001),就通过CAS将mark word里的部分地址记录为当前线程的ID,同时最后倒数第三的标志位置为1,即倒数三位的结果是(101),表示当前为轻量级锁。下一个如果该线程再次获取该锁的时候,就直接判断mark word里记录的线程ID是不是我当前的线程ID,如果是的话,就成功获取到锁了,即不需再进行CAS操作,这就是相对轻量级锁来说,偏向锁的优势(只需进行第一次的CAS,而无需每次都进行CAS,当然这个理想过程是没有其他线程来竞争该锁)。如果中途有其他线程来竞争该锁,发现已经是101状态,那么就会查看偏向锁记录的线程是否还存活,如果未存活,即偏向锁的撤消,将markword记录的锁状态从101(偏向锁)置未001(无锁),然后重新偏向当前竞争成功的线程,如果当前线程还是存活状态,那么就升级成轻量级锁。
轻量级锁,在当前线程A创建一个锁记录,然后尝试通过CAS把markword更新为指向线程A的锁记录的指针,如果成功了,那么markword最后两位就变成00(轻量级锁),如果此时又来了一个B线程,那么会在B线程中创建一个锁记录,尝试CAS把markword更新为指向线程A的该锁记录的指针,如果失败的话,会查看markword的指针指向的是不是B线程中的某个栈帧(锁记录),如果是,即A和B是同一个线程,也就是当前操作是重入锁操作,即在当前线程对某个对象重复加锁,这是允许的,也就是可以获取到锁了。如果markword记录的不是B线程中的某个栈帧(锁记录),那么线程B就会尝试自旋,如果自选超过一定次数,就会升级成重量级锁(轻量级锁升级成重量级锁的第一种时机:自选次数超过一定次数),如果B线程在自选的过程中,又来了一个线程C来竞争该锁,那么此时直接轻量级锁膨胀成重量级锁(轻量级锁升级成重量级锁的第二种时机:有两个以上的线程在竞争同一个锁。注:A,B,C3线程>2个线程)
请添加图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值