java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > synchronized锁的释放机制

解读synchronized锁的释放机制

作者:堕落年代

这篇文章主要介绍了synchronized锁的释放机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

synchronized锁的释放机制

synchronized 锁的释放机制是通过 JVM 底层的 Monitor 锁模型计数器机制 实现的。

以下是具体的释放逻辑和触发条件:

一、锁释放的触发条件

正常执行结束

当线程执行完 synchronized 修饰的代码块或方法时,JVM 会自动调用 monitorexit 指令释放锁。

异常退出

显式调用 wait()

二、锁释放的核心机制

计数器递减

Monitor 对象的状态管理

三、不同场景的锁释放示例

1. 同步代码块

public void method() {
    synchronized (this) {
        // 代码逻辑
    } // 此处自动执行 monitorexit 释放锁
}

无论正常结束还是抛出异常,monitorexit 都会触发锁释放。

2. 同步方法

public synchronized void method() {
    // 代码逻辑
} // 方法结束自动释放锁

通过 ACC_SYNCHRONIZED 标志隐式管理锁,无需显式字节码指令。

3. 异常场景

public void method() {
    synchronized (this) {
        throw new RuntimeException(); // 触发异常,自动释放锁
    }
}

即使未捕获异常,JVM 也会执行 monitorexit 指令释放锁。

四、锁释放的底层实现(字节码层面)

同步代码块

编译后生成 monitorenter 和两个 monitorexit(正常退出和异常退出)指令:

public void method();
  Code:
     0: aload_0
     1: dup
     2: astore_1
     3: monitorenter     // 获取锁
     4: ...              // 业务代码
    13: monitorexit      // 正常退出释放锁
    14: goto 20
    17: aload_1
    18: monitorexit      // 异常退出释放锁
    19: athrow
    20: return

同步方法

方法访问标志包含 ACC_SYNCHRONIZED,JVM 在方法入口和出口隐式管理锁。

五、注意事项

不会释放锁的操作

可重入性

总结

synchronized 锁的释放依赖于 JVM 的 Monitor 模型和计数器机制,通过以下方式触发:

  1. 代码块或方法正常结束。
  2. 未捕获异常抛出。
  3. 显式调用 wait()
  4. 其底层通过 monitorexit 指令或隐式标志确保锁的正确释放,保障线程安全。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文