Synchronized
关键字是 Java 中提供的一种基本的同步机制,它用于控制对共享资源的并发访问,以确保在任何时刻,只有一个线程可以执行一个方法或一块代码。
工作原理
在 JVM 内部,synchronized
关键字依赖于 Java 对象的内部锁(monitor lock)或监视器锁来实现同步。每个 Java 对象可以关联一个监视器锁,当通过 synchronized
关键字来标记方法或代码块时,执行这些代码的线程会先获取对象的锁,然后进入方法或代码块,退出时释放锁。
字节码层面
在字节码层面,synchronized
同步块对应监视器的进入和退出操作,这是通过 monitorenter
和 monitorexit
指令实现的。当线程进入 synchronized
块的时候,它执行 monitorenter
指令,尝试获取对象锁。如果对象锁已经被占用,则会阻塞直到锁被释放。当线程执行完同步块中的代码后,它执行 monitorexit
指令释放锁。
锁的获取与释放
- 当线程进入同步方法或同步块时,它会自动获取锁。
- 当线程正常退出同步方法或块,或者在方法或块中抛出异常时,它会自动释放锁。