-
无锁状态(无锁):当一个线程访问一个没有被锁定的Synchronized代码块时,处于无锁状态。此时,线程可以直接进入临界区执行代码,不需要进行任何锁协调。
-
偏向锁状态(偏向锁):当一个线程访问一个Synchronized代码块时,会尝试获取偏向锁。如果当前没有其他线程竞争同一个锁,并且之前没有发生过锁竞争,那么当前线程会获得偏向锁,并将对象头中的线程ID记录下来。此后,线程再次进入同步块时,无需再次竞争锁,直接进入临界区执行代码。
-
轻量级锁状态(轻量级锁):当多个线程竞争同一个锁时,偏向锁会升级为轻量级锁。在轻量级锁状态下,线程会尝试使用CAS(Compare and Swap)操作来获取锁,如果成功获取锁,则进入临界区执行代码。如果获取锁失败,表示有其他线程竞争锁,那么线程会膨胀为重量级锁。
4.自旋锁
自旋锁会假设在不久将来,当前的线程可以获得锁,因此虚拟机会让当前想要获取锁的线程做几个空循环(这也是称为自旋的原因),一般不会太久,可能是50个循环或100循环,在经过若干次循环后,如果得到锁,就顺利进入临界区。如果还不能获得锁,那就会将线程在操作系统层面挂起,这就是自旋锁的优化方式,这种方式确实也是可以提升效率的。最后没办法也就只能升级为重量级锁了。
- 重量级锁状态(重量级锁):当多个线程竞争同一个锁,并且轻量级锁获取锁失败时,锁会升级为重量级锁。在重量级锁状态下,线程会进入阻塞状态,等待锁的释放。当锁的持有者释放锁时,等待的线程会被唤醒,竞争锁的所有线程再次尝试获取锁。