Java对象头和Monitor是实现synchronized关键字的基础。
对象头
对象头在内存中的布局:
- 对象头
- 实例数据
- 对齐填充
重点说下对象头,对象头的结构:
- Mark Word: 默认存储对象的hashcode,分代年龄,锁类型,锁标志位等信息,实现轻量级锁和偏向锁的关键
- Class Meta Address:类型指针指向对象的类元数据,JVM通过这个指针确定该对象是哪个类的数据
Java中对象在创建的时候就自带了一把Monitor。早期版本中的synchronized依赖mutex lock实现,其底层依赖操作系统的内核态,开销很大,所以早期的加锁性能很低。而后来,HotSpot对synchronized做了很大的优化,现在的效率很不错了。
如:
- 自适应自旋
- 锁消除
- 自旋锁
- 轻量级锁
- 锁粗化
参考:Java高效并发(九)
锁升级
Synchonized的四种状态:
- 无锁
- 偏向锁,多数情况下,锁不存在竞争,总是由同一线程获得。
- 轻量级锁,由偏向锁升级来的,第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁
- 重量级锁,同一时间访问同一把锁,就会有线程获取锁失败,会导致轻量级锁升级为重量级锁