偏向锁(Biased Locking)
在Java中,当多个线程需要访问同一个对象时,为了保证数据的一致性,JVM会使用锁机制。锁有不同的级别,偏向锁是其中一种,目的是提高程序的性能。
偏向锁的优化原理
-
单线程场景优化:偏向锁假设大多数情况下,锁只会被同一个线程多次获取。这样就可以避免每次都去做复杂的加锁操作。
-
减少同步开销:如果一个对象已经被一个线程加了偏向锁,那么这个线程再次访问这个对象时,不需要再去做任何同步操作,大大减少了开销。
-
锁标记:对象头中会有一个标记,记录哪个线程拥有这个偏向锁。如果另一个线程尝试获取这个锁,偏向锁就会被撤销,升级为其他锁。
工作流程
- 初始状态:对象开始时没有锁。
- 偏向锁加锁:第一个线程访问对象时,JVM会给这个线程加偏向锁,记录在对象头中。
- 重复访问:如果同一个线程再次访问,不需要任何锁操作。
- 锁撤销:如果另一个线程尝试访问,偏向锁会被撤销,锁会升级为轻量级锁或重量级锁。
适用场景
偏向锁非常适合那些大部分时间只有一个线程访问的场景。如果线程竞争激烈,偏向锁的好处就不明显了,这时JVM会自动调整锁的级别。
通过偏向锁,JVM可以在某些场景下大幅度提升性能,因为它减少了不必要的同步开销。