一、先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现
为以下3种形式。
- 对于普通同步方法,锁是当前实例对象。
- ·对于静态同步方法,锁是当前类的Class对象。
- ·对于同步方法块,锁是Synchonized括号里配置的对象。
二、synchronized用的锁是存在Java对象头里的。如果对象是数组类型,则虚拟机用3个字宽
(Word)存储对象头,如果对象是非数组类型,则用2字宽存储对象头。在32位虚拟机中,1字宽
等于4字节,即32bit。
长度 | 内容 | 说明 |
32/64bit | Mark Word | 存储对象的hashcode和锁信息 |
32/64bit | Class Metadata Address | 存储对象类型数据的指针 |
32/64bit | Array length | 数组长度(若是数组对象) |
三、对象锁状态
- 轻量级锁
- 重量级锁
- GC标记
- 偏向锁