java中的锁:Synchronized的四种状态(无锁、偏向锁、轻量级锁、重量级锁)
发布人:shili8
发布时间:2025-03-08 23:20
阅读次数:0
**Java 中的锁:Synchronized 的四种状态**
在 Java 中,`Synchronized` 是一个关键字,它用于实现线程安全的编程。在 Java6 之前,`Synchronized` 使用的是重量级锁(ReentrantLock),而从 Java7 开始,`Synchronized` 使用了偏向锁(Biased Locking)、轻量级锁(Lightweight Locking)和重量级锁(ReentrantLock)的组合来实现线程安全。下面我们将分别介绍这四种状态。
### **1. 无锁**
无锁是 Java 中 `Synchronized` 的一种基本状态。在这种状态下,对象的锁没有被任何线程占有。也就是说,没有任何线程正在等待这个锁。
javapublic class NoLock { public synchronized void method() { System.out.println("No lock"); } }
在上面的示例中,我们定义了一个 `NoLock` 类,它的 `method()` 方法被标记为 `synchronized`。这意味着当线程 A 执行这个方法时,其他线程将无法进入这个方法。
### **2. 偏向锁**
偏向锁是 Java7 中引入的一种优化锁机制。当一个线程首次访问一个对象的同步方法或块时,它会获得偏向锁。偏向锁是一种轻量级的锁,它不需要在每个线程之间进行加锁和解锁操作。
javapublic class BiasedLock { private final Object lock = new Object(); public void method() { synchronized (lock) { System.out.println("Biased lock"); } } }
在上面的示例中,我们定义了一个 `BiasedLock` 类,它的 `method()` 方法使用偏向锁。偏向锁会优化线程之间的加锁和解锁操作。
### **3. 轻量级锁**
轻量级锁是 Java7 中引入的一种优化锁机制。当多个线程竞争一个对象的同步方法或块时,轻量级锁会被转换为重量级锁。轻量级锁是一种快速的锁,它不需要在每个线程之间进行加锁和解锁操作。
javapublic class LightWeightLock { private final Object lock = new Object(); public void method() { synchronized (lock) { System.out.println("Light weight lock"); } } }
在上面的示例中,我们定义了一个 `LightWeightLock` 类,它的 `method()` 方法使用轻量级锁。轻量级锁会优化线程之间的加锁和解锁操作。
### **4. 重量级锁**
重量级锁是 Java 中 `Synchronized` 的一种基本状态。在这种状态下,对象的锁被多个线程占有。也就是说,有多个线程正在等待这个锁。
javapublic class ReentrantLock { private final Object lock = new Object(); public void method() { synchronized (lock) { System.out.println("Reentrant lock"); } } }
在上面的示例中,我们定义了一个 `ReentrantLock` 类,它的 `method()` 方法使用重量级锁。重量级锁会阻止其他线程进入这个方法。
**总结**
Java 中的 `Synchronized` 使用四种状态来实现线程安全:无锁、偏向锁、轻量级锁和重量级锁。在不同的场景下,选择合适的锁状态可以优化程序的性能。