锁消除、自旋锁、偏向锁、轻量级锁、重量级锁小小简介

Java对象头

锁存在Java对象头里

如果对象是数组类型,则虚拟机用3 Word储存对象头

如果对象是非数组类型,则虚拟机用2 Word储存对象头

32 bit JVM中,一字宽 = 32 bit= 4 byte

Java对象头信息
长度内容说明
32/64 bitMark Word储存对象的hashCode和锁信息
32/64 bitClass Metadata Address储存对象类型数据的指针
32/64 bitArray Length数组的长度(如果当前的对象是数组)
32 bit JVM的Mark Word默认存储结构
25 bit4 bit1 bit(是否为偏向锁)2 bit(锁标志位)
无锁状态对象的hashCode对象分代年龄001

运行期间Mark Word的储存的数据会随着锁标志位变化而变化

Mark Word有以下四种状态变化:

锁状态25 bit4 bit1 bit 2 bit
23 bit2 bit是否为偏向锁锁标志位
轻量级锁指向栈中锁记录的指针00
重量级锁指向互斥量(重量级锁)的指针10
GC标记11
偏向锁线程IDEpoch(偏向锁的时间戳)对象分代年龄101


自旋锁:

线程的阻塞和唤醒需要CPU从用户态转为核心态,过于频繁的转换对于CPU是个过重的负担,同时我们知道有些时候锁的锁定状态只会持续很短的一段时间,像是整数的自加操作,因此加入了自旋锁。
所谓的自旋就是让线程去执行无意义的循环,循环结束再去竞争锁,如果竞争不到继续循环,循环过程中线程会一直处于running状态,但是基于JVM的线程调度,会出让时间片,所以其他线程依旧有申请锁和释放锁的机会。

自旋的次数一般控制在一个范围内,例如10次、1次0次等,在超出这个范围后,自旋锁会升级为阻塞锁

锁消除:

锁消除是指虚拟机即时编译器在运行时,一些代码要求同步,但是被检测到不可能存在共享数据竞争的锁就会被削除。

锁偏向:

只有一个线程进入临界区,目的是使某个线程获得锁之后,消除CAS Mark Word的开销,让这个线程得到偏护。

轻量级锁:

多线程交替进入临。

重量级锁:

多线程同时进入临界区


参考资料【1】
参考资料【2】
参考资料【3】

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值