synchronized 的原理
synchronized 的核心原理在于锁定对象的监视器(Monitor)。每个对象都有一个与之关联的监视器,它控制着对象的访问权限。
获取锁: 当线程进入 synchronized 块或方法时,它会尝试获取对象的监视器。如果监视器已被其他线程占用,则当前线程会被阻塞,进入 BLOCKED 状态,等待锁的释放。
进入临界区: 获取锁的线程可以进入 synchronized 块或方法,执行临界区内的代码。临界区是指受 synchronized 保护的代码块,它确保同一时间只有一个线程可以执行。
释放锁: 线程执行完临界区代码后,会释放对象的监视器,其他被阻塞的线程可以尝试获取锁,进入临界区。
synchronized 的实现
方法同步: 使用 ACC_SYNCHRONIZED 标志表示方法为同步方法,并在方法调用和返回时使用 monitorenter 和 monitorexit 指令。
代码块同步: 使用 monitorenter 和 monitorexit 指令控制同步块的进入和退出。对象锁和类锁分别对应不同类型的 synchronized 使用方式。
synchronized 如何保证线程安全
排他性: 同一时间只有一个线程可以访问 synchronized 保护的代码块或方法。
可见性: 当一个线程修改共享变量时,其他线程能够立即看到这个修改,因为 synchronized 会将变量的值刷新到主内存。
原子性: synchronized 保护的代码块或方法是原子操作,即不会被其他线程打断。
本文作者:whitebear
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!