编辑
2024-03-06
面试题库
0
请注意,本文编写于 322 天前,最后修改于 149 天前,其中某些信息可能已经过时。

synchronized 的原理

synchronized 的核心原理在于锁定对象的监视器(Monitor)。每个对象都有一个与之关联的监视器,它控制着对象的访问权限。

获取锁: 当线程进入 synchronized 块或方法时,它会尝试获取对象的监视器。如果监视器已被其他线程占用,则当前线程会被阻塞,进入 BLOCKED 状态,等待锁的释放。

进入临界区: 获取锁的线程可以进入 synchronized 块或方法,执行临界区内的代码。临界区是指受 synchronized 保护的代码块,它确保同一时间只有一个线程可以执行。

释放锁: 线程执行完临界区代码后,会释放对象的监视器,其他被阻塞的线程可以尝试获取锁,进入临界区。

synchronized 的实现

方法同步: 使用 ACC_SYNCHRONIZED 标志表示方法为同步方法,并在方法调用和返回时使用 monitorenter 和 monitorexit 指令。

代码块同步: 使用 monitorenter 和 monitorexit 指令控制同步块的进入和退出。对象锁和类锁分别对应不同类型的 synchronized 使用方式。

synchronized 如何保证线程安全

排他性: 同一时间只有一个线程可以访问 synchronized 保护的代码块或方法。

可见性: 当一个线程修改共享变量时,其他线程能够立即看到这个修改,因为 synchronized 会将变量的值刷新到主内存。

原子性: synchronized 保护的代码块或方法是原子操作,即不会被其他线程打断。

本文作者:whitebear

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!