美团一面:说说synchronized的实现原理?
在Java中,synchronized
是用于实现线程同步的关键字,其底层实现原理涉及对象头、监视器锁(Monitor)以及锁升级机制。以下是详细解析:
1. 对象头与Mark Word
每个Java对象在内存中由三部分组成:
- 对象头(Header) :存储对象的元数据,包括锁状态、GC分代年龄等。
- 实例数据(Instance Data) :对象的成员变量。
- 对齐填充(Padding) :确保对象内存对齐。
Mark Word是对象头的一部分,记录了对象的锁状态、哈希码、分代年龄等信息。在32位JVM中,Mark Word占4字节;64位JVM中占8字节。不同锁状态下,Mark Word的内容会动态变化:
锁状态 | 存储内容 |
---|---|
无锁 | 哈希码、分代年龄、是否偏向锁(0) |
偏向锁 | 线程ID、Epoch、分代年龄、偏向标记(1) |
轻量级锁 | 指向栈中锁记录的指针(Lock Record) |
重量级锁 |