JDK1.6重点提升了并发性能,HotSpot开发团队实现了各种锁优化技术,如适应性自旋锁、锁消除、锁粗化、轻量级锁和偏向锁
重量级锁
线程遇到synchronized关键词时,需要获取锁,这个时候需要使用系统调用获取互斥量,如果没有获取到则被操作系统挂起线程,因为此过程需要进行用户态转内核态,而且有可能需要切换线程,操作比较重,所以称为重量级锁。
轻量级锁
在大部分场景下,共享数据的锁定状态只会持续很短的一段时间,使用重量级锁的话,锁的获取和上下文切换的时间,可能都比共享逻辑执行时间还长,得不偿失,所以引入轻量级锁。 轻量级锁,是乐观锁的一种,如果对象上的锁被其他线程获取,则自旋等待。 如果超过一定的自旋次数后,则膨胀为重量级锁
偏向锁
在一些场景中,共享数据实际上只会被一个线程访问,使用偏向锁就只需要开始加锁的一次CAS,效率最高。如果遇到锁竞争,则膨胀为轻量级锁
疑问
- mark word一共是32位,当标志位是00(轻量级锁)时,指向锁记录的指针位数只有30位,30位如何保存下指针呢?
- 膨胀为重量级锁时,如何让已经拥有该对象轻量级锁获取到重量级锁,也就是内核的互斥量?
- 偏向锁时,mark word前面保存了偏向线程ID,那么对象哈希码保存到哪里去了?