几种锁的类型
⼀个对象有四种锁状态,它们级别由低到⾼依次是:
- ⽆锁状态
- 偏向锁状态:适⽤于只有⼀个线程访问同步块场景。
- 轻量级锁状态:追求响应时间。同步块执⾏速度⾮常快。
- 重量级锁状态:重量级锁依赖于操作系统的互斥量实现,操作系统中线程状态转换需要相对比较长的时间,所以重量级锁效率低,但被阻塞的线程不会消耗CPU,追求吞吐量。同步块执⾏速度较⻓。
⼏种锁会随着竞争情况逐渐升级,锁的升级很容易发⽣,但是锁降级发⽣的条件会⽐较苛刻,锁降级发⽣在Stop The World期间,当JVM进⼊安全点的时候,会检查是否有闲置的锁,然后进⾏降级。
对象头
Java的锁都是基于对象的,对象的锁信息放在对象头中。
每个Java对象都有对象头。如果是⾮数组类型,则⽤2个字宽来存储对象头,如果是数组,则会⽤3个字宽来存储对象头。
在32位处理器中,⼀个字宽是32位;在64位虚拟机中,⼀个字宽是64位。对象头的内容如下:
Mark Word(运行时元数据)的内容如下:
参考资料
本文参考于这里