面试高频问题:JAVA的锁升级

本文详细介绍了Java中的synchronized关键字及其背后的锁升级机制。从共享数据的修改和临界资源访问的应用场景出发,讲解了synchronized的原理,包括对象头的组成,尤其是Mark Word在不同锁状态下的变化。锁升级的过程从偏向锁到轻量级锁再到重量级锁,每一步都关乎性能和线程安全。最后,讨论了Monitor在重量级锁中的作用以及线程间的交互方式。
摘要由CSDN通过智能技术生成

背景

在java中,经常会用到synchronized关键字来保证线程安全,那么什么时候会存在线程安全呢?

  • 共享数据的修改
  • 临界资源访问

应用场景

  • 修饰普通同步方法:锁当前实例对象
  • 修饰静态同步方法:锁当前的类Class对象
  • 修饰同步代码块:锁Synchronized后面括号里配置的对象,这个对象可以是任意对象;

synchronized原理

在绝大多数情况下,都只会有一个线程去访问synchronized修饰的代码块,所以synchronized在jdk1.6之后为了提升效率,优化了synchronized的机制,就是所谓的锁升级。通过对象头ObjectMonitor对象将锁划分了几个类型,其升级顺序为:无锁->偏向锁->轻量级锁->重量级锁,要了解它的原理,则必须要了解对象头。

对象头

java对象保存在内存中,由3个部分组成:

  • 对象头

  • 实例数据

  • 对齐填充字节

    这里,我们只对对象头加以说明

1、对象头的存在形式

JVM中的对象头有两种形式,它由三部分组成:

  • Mark Word
  • Klass Pointer(指向类的指针)
  • 数组长度(只有数组对象才有)
1.1 普通对象
|--------------------------------------------------------------|
|                     Object Header (64 bits)                  |
|------------------------------------|-------------------------|
|        Mark Word (32 bits)         |    Klass Word (32 bits) |
|------------------------------------|--------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值