synchronized 锁升级过程
发布日期:2021-05-14 12:39:14 浏览次数:15 分类:精选文章

本文共 900 字,大约阅读时间需要 3 分钟。

锁升级过程

synchronized在JDK 1.6之前是一个重量级锁,它的使用会直接向操作系统请求锁资源,因此效率较低且占用内存资源较大。在JDK 1.6及以后的版本中,引入了锁升级机制,能够根据实际情况自动调整锁的重量级,以提高效率和资源利用率。这种机制分为偏向锁、轻量级锁和重量级锁的多级升级过程,具体如下:

1. 偏向锁升级到轻量级锁的过程

偏向锁并不是传统意义上的锁资源,而是一种特殊的标记。它作为一个优先级标签,用于表示某个线程优先获得锁。如果一个线程已经获得偏向锁,其他线程在请求锁资源时必须等待。但在多线程环境下,当有其他线程请求锁时,偏向锁会自动升级为轻量级锁,以确保资源的高效利用。在这种情况下:

  • 每个线程都需要生成独立的锁记录(LockRecord,简称LR)。
  • 线程通过“比较与交换”(CAS)机制来抢占锁记录的指针。
  • 如果抢占成功,锁记录的指针会更新为当前线程的标记,这表明该线程已经获得锁;如果失败,线程会在原地自旋等待,直到成功获取锁为止。

这种机制能够在存在竞争的情况下,轻松地将偏向锁升级为轻量级锁。

2. 轻量级锁升级到重量级锁的过程

尽管轻量级锁(自旋锁)的自旋方式能够减少等待时间,但在以下情况下会自动升级为重量级锁:

#####老版本的升级条件

  • 自旋次数超过限制:如果线程在尝试获取锁时进行自旋超过10次,JVM会直接将锁升级为重量级锁。\
  • 自旋线程数量超过CPU核数的二分之一:当自旋锁的线程数量超过CPU核数的一半时,锁也会直接升级为重量级锁。

#####新版本的升级条件

在新版本的JVM中,采用了自适应自旋(Adaptive CAS)机制。JVM会根据实际性能情况动态调整自旋次数,避免传统自旋锁的资源占用问题。这种机制使得锁升级更加智能和灵活,不需要手动配置参数就能达到最优效果。

总结

通过对上述过程的了解,可以看出锁升级机制在多线程环境下起到了关键作用。在偏向锁阶段,为单线程环境提供了优化;而轻量级锁和重量级锁的升级机制则确保了在多线程、高并发场景下的资源利用率和系统性能。这种多层次的锁升级机制,使得Java的并发编程能力得到了进一步提升。

上一篇:图解spring中七种事务传播行为 终于有人讲明白了
下一篇:ReentrantLock底层原理、手写Lock锁

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年04月12日 20时49分00秒