Java中锁的原理介绍

本文详细介绍了Java中synchronized的使用方式,包括修饰实例方法、静态方法和代码块。深入探讨了synchronized的底层实现,涉及Java对象头、Monitor、偏向锁和轻量级锁等概念,阐述了Java虚拟机对synchronized的优化策略,如自旋锁,旨在提高并发性能。
摘要由CSDN通过智能技术生成

synchronized

​ 在 Java 中,关键字 synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(原子性)。同时synchronized另外一个重要的作用,synchronized可保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(可见性)。

使用方式
  • 修饰实例方法,作用于当前实例加锁,进入方法前要获得当前实例的锁
  • 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁
  • 修饰代码块,对给定对象加锁,进入同步代码块前要获得给定对象的锁。
底层实现原理
Java对象头与Monitor

​ synchronized使用的锁对象是存储在Java对象头里的,jvm中采2个字宽来存储对象头(如果对象是数组则会分配3个字宽,多出来的1个字宽记录的是数组长度),其主要结构是由Mark Word 和 Class Metadata Address 组成,其结构说明如下表:

​ synchronized使用的锁对象是存储在Java对象头里的,jvm中采2个字宽来存储对象头(如果对象是数组则会分配3个字宽,多出来的1个字宽记录的是数组长度),其主要结构是由Mark Word 和 Class Metadata Address 组成,其结构说明如下表:

虚拟机位数 头对象结构 说明
32/64bit Mark Word 存储对象的hashCode、锁信息或分代年龄或GC标志等信息
32/64bit Class Metadata Address 类型指针指向对象的类元数据,JVM通过这个指针确定该对象是哪个类的实例。

​ Java对象头里的Mark Word里默认存储对象的HashCode,分代年龄和锁标记位。32位JVM的Mark Word的默认存储结构如下:

锁状态 25bit 4bit 1bit是否是偏向锁 2bit 锁标志位
无锁状态 对象HashCode 对象分代年龄 0 01

​ 在运行期间Mark Word里存储的数据会随着锁标志位的变化而变化。Mark Word可能变化为存储以下4种数据:

​ 重量级锁也就是通常说synchronized的对象锁,锁标识位为10,其中指针指向的是monitor对象的起始地址。每个对象都存在着一个 monitor 与之关联,对象与其 monitor 之间的关系有存在多种实现方式,如monitor可以与对象一起创建销毁或当线程试图获取对象锁时自动生成,但当一个 monitor 被某个线程持有后,它便处于锁定状态。在Java虚拟机(HotSpot)中,monitor是由ObjectMo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值