JAVA 并发机制的底层实现原理之synchronized

synchronized 在多线程并发中一直是元老级角色,在java SE 1.6 中为了减少获取锁和释放锁引入了偏向锁、轻量级锁、以及重量级锁。

synchronized 实现同步基础

java 中的每一个对象可以作为锁,具体的是以下三种形式:

  • 对于普通的同步方法 , 锁的是当前实例对象。
  • 对于静态同步方法,锁的是当前类的Class 对象。
  • 对于同步方法块,锁的是Synchonized括号里面的代码块。

Synchonized 在JVM 的实现原理

JVM 进入和退出Monitor 对象实现方法同步和代码同步,但是两种的实现细节不一样。代码块同步是使用monitorenter和monitorexit 来实现,而方法同步是使用的另外一种形式来实现的。

monitorenter 指令是在编译后插入到同步代码块开始的位置,而monitorexit是插入到方法结束和异常处,JVM 要保证美国monitorenter 必须有对应的monitorexit与之匹配。任何对象都有一个monitor 关联,当且一个monitor 被持有后,它将处于锁定状态。线程执行到monitorenter 时,将会尝试取对象所对应的monitor的所有权。

Java 对象头

synchonized 用的锁时存在Java 对象头里面的。如果对象时数组类型,则虚拟机用3给字宽存储对象头,如果对象是非数组类型,则用2个字宽存储对象头。 (在32 位虚拟机里。1字宽等于4字节 ,等于32bit)

长度内容说明
32/64bitMark Word存储hashCode 或者锁新形象
32/64bitClass Metadata Address存储到对象类型数据的指针
32/32bitArray length数组长度

java 对象头里面的Mark Word 里默认存储的对象是HashCode 、分代年龄和锁标记位。

25bit4bit1bit2bit
对象的Hashcode对象分代年龄对象是否是偏向锁锁的标志位

不同的锁表示的不一样,上面这个是无锁的状态

锁状态1-30bit31-32bit
轻量级锁指向栈中记录的指针锁标记(00)
锁状态1-30bit31-32bit
重量级锁指向互斥量(重量级锁)的指针锁标记(10)
锁状态1-30bit31-32bit
GC标记锁标记(11)
锁状态1-23bit24-25bit26-29bit30bit31-32bit
偏向锁线程IDEpoch对象分代年龄是否是偏向锁(1)锁标记(01)

在64位虚拟机下,Work Mord 就是64 的大小

锁状态1-54bit55-56bit57bit58-61bit62bit63-64bit
偏向锁ThreadIdEpochcms_free对象分代年龄是否是偏向锁(1)锁标记(01)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值