技术文摘
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 中一种基本的同步机制,虽然在实现上相对简单直接,但在实际应用中需要根据具体的场景和性能要求来选择是否使用。对其实现原理的深入理解,有助于我们更好地利用多线程技术,提高程序的并发性能和可靠性。
- 头发未掉!领略全球 14 位顶尖程序员的风采
- Python 视角下的偏度与峰度解析
- 微服务的大白话解读:人人能懂的演进历程
- 安酱无项目经历,竟不知低耦合高内聚
- 微服务限流的逻辑与算法
- 谈谈构建的抽象性
- Spring Boot 整合 RabbitMQ 与事务补偿实战教程
- Java 多线程探秘
- 我必知的这些 ECMAScript 模块知识
- 女朋友对我提及:Dubbo 的服务引用过程
- Edge DevTools 对 Web 应用程序 API 的分析方法
- 别再重复造轮子,试试这个 jupyter 插件
- 数据中台与低代码:企业数字化管理的新方向
- 低代码开发平台是什么
- 利用 C++模板达成三种异步收发数据的方式