synchronized概述
synchronized就是所谓的重量级锁, 但是自从jdk1.6引入了偏向锁, 轻量级锁之后, synchronized就没有那么重了。
synchronized用法
- 对于普通同步方法,锁是当前实例对象
- 对于静态同步方法,锁是当前类的Class对象
- 对于同步方法块,锁是Synchonized括号里配置的对象
synchronized实现原理
- 任何对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态
- 使用monitorenter和monitorexit指令实现
- monitorenter指令是在编译后插入到同步代码块的开始位置
- 线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁
- monitorexit是插入到方法结束处和异常处
- JVM要保证每个monitorenter必须有对应的monitorexit与之配对
- synchronized用的锁是存在Java对象头里的
Java对象头
Java对象头的长度
长 度 | 内 容 | 说 明 |
---|---|---|
32/64bit | Mark Word | 存储对象的hashCode或锁信息 |
32/64bit | Class Metadata Address | 存储到对象类型数据的指针 |
32/64bit | Array length | 数组的长度(如果当前对象是数组) |
Java对象头的存储结构
Java对象