技术文摘
Synchronized 实现原理(一)
Synchronized 实现原理(一)
在 Java 多线程编程中,Synchronized 是一种常用的同步机制,用于确保在同一时刻只有一个线程能够访问被修饰的代码块或方法。理解 Synchronized 的实现原理对于编写高效、正确的多线程程序至关重要。
Synchronized 是基于对象监视器(Monitor)来实现的。每个对象都有一个与之关联的监视器。当一个线程试图获取一个对象的锁时,它会尝试进入该对象的监视器。
在字节码层面,Synchronized 修饰的方法通过在方法的访问标志中设置 ACC_SYNCHRONIZED 标志来实现同步。当线程调用一个被 Synchronized 修饰的方法时,JVM 会检查该方法是否设置了此标志。如果设置了,线程会先尝试获取对象的监视器。如果获取成功,线程就可以执行方法体;如果获取失败,线程会被阻塞并放入对象的等待队列中,直到获取到监视器为止。
对于 Synchronized 修饰的代码块,通过 monitorenter 和 monitorexit 指令来实现。线程在进入代码块之前,需要执行 monitorenter 指令获取对象的监视器。在代码块执行完毕后,需要执行 monitorexit 指令释放监视器。
对象的监视器包含了两个重要的队列:等待队列(WaitQueue)和同步队列(EntryList)。当一个线程获取锁失败时,会被放入同步队列中等待。而当一个拥有锁的线程调用 wait 方法时,会释放锁并进入等待队列等待被唤醒。
Synchronized 能够保证线程的可见性和原子性。可见性是通过内存屏障来实现的,在释放锁和获取锁的过程中,会强制刷新缓存,使线程能够看到最新的共享变量的值。原子性则是通过保证同一时刻只有一个线程能够执行被 Synchronized 修饰的代码块或方法来实现的。
然而,Synchronized 也存在一些缺点。例如,它是一种重量级的锁机制,在竞争激烈的情况下,线程的阻塞和唤醒会带来较大的性能开销。它不够灵活,无法实现诸如读写锁、公平锁等更复杂的锁策略。
Synchronized 作为 Java 中一种基本的同步机制,虽然在实现上相对简单直接,但在实际应用中需要根据具体的场景和性能要求来选择是否使用。对其实现原理的深入理解,有助于我们更好地利用多线程技术,提高程序的并发性能和可靠性。
- Python 编程:轻松掌握上下文管理器
- Redis 大 Key 与多 Key 拆分方案:你掌握了吗?
- Java 中代理模式的三种实现方式
- 智能合约审计:借助 VS Code、Hardhat 与 Slither
- 配置化表单 FormRender 初探
- GoFrame 的 gmap 与 Go 原生的 map:前者天然支持排序和有序遍历?
- Docker 镜像大小缩减 95%,看我怎样做到
- 500W 数据与 20Wqps 分词检索的架构设计之道
- ArchUnit:软件架构的全面掌控之神
- Python 八种数据导入方式,你是否已精通?
- AR 和 VR 技术对沉浸式学习的改进之道
- 纯 JavaScript 达成平滑曲线的生成
- GitHub 高质量数据结构与算法项目精选
- 时间序列的分解:基本构建块的拆解
- 一次因 Groovy 导致的 Full GC 问题排查