synchronized原理

synchronized 是 Java 中用于实现线程同步的关键字,它可以保证在同一时刻只有一个线程能够访问被 synchronized 修饰的代码块或方法,从而避免多线程环境下的数据竞争和不一致问题。

实现机制

1、同步方法:当一个方法被 synchronized 修饰时,它被称为同步方法。在字节码层面,同步方法会有一个 ACC_SYNCHRONIZED 标志。当线程访问该方法时,会检查这个标志,如果设置了该标志,线程需要先获取该方法所属对象的监视器(monitor),获取成功才能执行方法体,执行完毕后释放监视器。
2、同步代码块:同步代码块使用 synchronized 关键字指定一个对象作为锁。在字节码中,同步代码块通过 monitorenter 和 monitorexit 指令来实现。当线程执行到 monitorenter 指令时,会尝试获取指定对象的监视器,获取成功后进入同步代码块;当执行到 monitorexit 指令时,释放监视器。
3、监视器(Monitor):监视器是 Java 中实现同步的基础,它是一个对象级别的锁。每个 Java 对象都可以关联一个监视器,当一个线程尝试访问被 synchronized 保护的代码时,实际上是在尝试获取该对象的监视器。

  • 3.1、获取监视器:当一个线程成功获取到对象的监视器后,它就成为该监视器的持有者,其他线程无法再获取该监视器,只能进入阻塞状态等待。
  • 3.2、释放监视器:当持有监视器的线程执行完同步代码块或同步方法后,会释放监视器,此时其他等待的线程有机会竞争获取该监视器。

总结

synchronized 通过监视器机制实现了线程同步,保证了同一时刻只有一个线程能够访问同步代码。Java 对 synchronized 进行了多种优化,如偏向锁、轻量级锁等,以提高其在不同场景下的性能。理解 synchronized 的原理有助于在多线程编程中正确使用该关键字,避免数据竞争和提高程序的性能。

posted @ 2025-03-25 08:30  蒟蒻00  阅读(52)  评论(0)    收藏  举报