技术文摘
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 中一种基本的同步机制,虽然在实现上相对简单直接,但在实际应用中需要根据具体的场景和性能要求来选择是否使用。对其实现原理的深入理解,有助于我们更好地利用多线程技术,提高程序的并发性能和可靠性。
- node-exporter 存在 pprof 调试信息泄露漏洞
- Windows 系统中利用 vbs 循环运行.bat/.exe 等文件
- 借助 BAT 完成文件批量修改文件名
- VBS 文件操作的代码集合
- bat 批处理文件定时运行程序的代码
- 批处理(Bat)实现文件夹批量解压、文件提取与合并
- perl 交叉编译全面解析
- 从零起步打造 PyTorch 的 Singularity 容器镜像之方案
- Python 中创建数值列表的四种方法汇总
- Python 虚拟环境 venv 与 virtualenv 配置方法
- Python 中死循环的终止与开启方法
- Python 中 tkinter 实现 GUI 程序的三个实例教程
- Python 怎样复制他人的虚拟环境
- Python 中 round() 函数用于数值的四舍五入
- Python 中怎样统计字符串里汉字的数量