synchronized 关键字默认采用的是偏向锁。
1. 在程序运行中,如果始终只有一个线程去获取 synchronized 这个锁的话,在 Java 对象中会记录一个线程的 ID,所以在下次获取 synchronized 锁的时候,只需要比较这个线程 ID 就行了。
2. 在程序运行过程中,如果有第二个线程去请求 synchronized 锁的时候,这里就要分成两种情况。
(1)第一种是在没有发生并发竞争锁的情况下,synchronized 会自动升级为轻量级锁,这个时候第二个线程就会尝试自旋锁的方式来获取锁,因为很快就能拿到锁,所以第二个线程也不会被阻塞。
(2)第二种情况是如果这两个线程出现竞争锁的话,synchronized 会升级为重量级锁,这个时候就只有一个线程可以获得锁,另一个线程就会被阻塞到,只有第一个线程释放锁之后,第二个线程才能拿到锁。