推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
总结——》【Linux】
总结——》【MongoDB】
总结——》【Elasticsearch】
Java——》JVM对原生的锁做了哪些优化
- 优化1:使用自旋锁
- 优化2:提供了3种不同的Monitor实现(3种不同的锁)
在Java6之前,Monitor的实现完全
依赖底层操作系统的互斥锁
来实现,由于Java层面的线程与操作系统的原生线程有映射关系,如果要将一个线程进行阻塞或唤起都需要操作系统的协助,这就需要从用户态
切换到内核态
来执行,这种切换代价十分昂贵
,很消耗处理器时间
,现代JDK中做了大量的优化。
优化1:使用自旋锁
在线程进行阻塞操作之前先让线程自旋等待一段时间,可能在等待期间其他线程已经解锁,这时就无需再让线程执行阻塞操作,避免了用户态到内核态的切换。
优化2:提供了3种不同的Monitor实现(3种不同的锁)
- 偏向锁
- 轻量级锁
- 重量级锁
当JVM检测到不同的竞争状况时,会自动切换到适合的锁实现,这就是锁的升级、降级(Java——》synchronized锁升级)。