锁主要存在四种状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,他们会随着竞争的激烈而逐渐升级。注意锁可以升级不可降级,这种策略是为了提高获得锁和释放锁的效率。
synchronized
锁的膨胀(Lock Inflation)是指锁从一种较轻量级的锁状态逐渐升级到更重量级的锁状态的过程。这个过程是自动进行的,目的是为了提高性能和避免锁竞争。
锁的膨胀通常经历以下几个阶段:
-
无锁:初始状态,没有线程进入同步代码块。
-
偏向锁:当线程第一次访问同步代码块时,JVM 会将锁标记为偏向锁,并偏向第一个获取锁的线程。如果同一个线程再次进入同步代码块,不需要进行额外的同步操作。
-
轻量级锁:如果另一个线程尝试进入同步代码块,JVM 会先尝试轻量级锁。轻量级锁通过CAS(Compare-And-Swap)操作来实现,避免了重量级锁的开销。
-
重量级锁:如果轻量级锁竞争失败,或者线程在轻量级锁状态下被阻塞,JVM 会将锁升级为重量级锁。重量级锁依赖于操作系统的互斥锁,开销较大。
-
自旋锁:在轻量级锁和重量级锁之间,JVM 可能会尝试自旋锁。自旋锁是一种让当前线程在获取锁之前进行一定次数的循环等待,以期望很快获得锁。
锁膨胀的过程是自动的,JVM 会根据线程的争用情况来决定是否需要升级锁。这种机制有助于在不同的线程争用情况下提供最优的性能。例如,在单线程环境下,偏向锁可以提供最小的性能开销;而在高并发环境下,重量级锁可以确保同步操作的安全性。