Java锁升级

非原创,忘记原文链接,如有侵权请联系

对象大致可以分为3个部分:对象头,实例变量和填充字节
对象头:主要由MarkWork和Klass Point(类型指针)组成,其中Klass Point是是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例,Mark Word用于存储对象自身的运行时数据。如果对象是数组对象,那么对象头占用3个字宽(Word),如果对象是非数组对象,那么对象头占用2个字宽。(1word = 2 Byte = 16 bit)
实例变量:存储的是对象的属性信息,包括父类的属性信息,按照4字节对齐
填充字节:JVM要求对象必须是8字节的倍数,填充字节就是用来凑齐整数倍的

Synchronized对应重量级锁

锁的4中状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态(级别从低到高)
锁可以升级但是不能降级,偏向锁可以设置为无锁状态

偏向锁:
优点:加锁无需额外的消耗,和非同步方法相差纳秒级
缺点:如果竞争的线程多,那么会带来额外的锁撤销的消耗
适用场景:基本没有线程竞争锁的同步场景

轻量级锁
优点:竞争的线程不会阻塞,使用自旋,提高程序响应速度
缺点:线程阻塞,响应时间长
适用场景:适用于少量线程竞争锁对象,且线程持有锁的时间不长,追求响应速度的场景

重量级锁:
优点:线程竞争不使用CPU自旋,不会导致CPU空转消耗CPU资源
缺点:线程阻塞,响应时间长
适用场景:很多线程竞争锁,锁的持有时间长,追求吞吐量的场景

锁粗化:
按理来说,同步块的作用范围应该尽可能小,仅在共享数据的实际作用域中才进行同步,这样做的目的是为了使需要同步的操作数量尽可能缩小,缩短阻塞时间,如果存在锁竞争,那么等待锁的线程也能尽快拿到锁。
但是加锁解锁也需要消耗资源,如果存在一系列的连续加锁解锁操作,可能会导致不必要的性能损耗。
锁粗化就是将多个连续的加锁、解锁操作连接在一起,扩展成一个范围更大的锁,避免频繁的加锁解锁操作。

锁消除:
Java虚拟机在JIT编译时(可以简单理解为当某段代码即将第一次被执行时进行编译,又称即时编译),通过对运行上下文的扫描,经过逃逸分析,去除不可能存在共享资源竞争的锁,通过这种方式消除没有必要的锁,可以节省毫无意义的请求锁时间

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值