Java同步模型以监视器锁(Monitor)为核心,通过互斥访问与内存可见性保障解决竞态条件,依赖JMM规范线程与主存/工作内存交互,并借助对象内置Monitor、锁升级机制及不同同步语法实现高效线程安全。

Java中的同步模型,核心是围绕监视器锁(Monitor)构建的协作机制,它通过互斥访问 + 内存可见性保障来解决多线程并发下的竞态条件问题。
同步模型依赖Java内存模型(JMM)
JMM定义了线程如何与主内存、工作内存交互。所有共享变量都存于主内存,每个线程拥有自己的工作内存,保存变量副本。没有同步时,线程可能一直读写旧副本,导致数据不一致。
- synchronized在释放锁前,强制将工作内存中修改的变量刷新回主内存
- 在获取锁时,强制从主内存重新读取变量最新值
- 这种“锁进出”行为建立了happens-before关系,确保操作顺序和可见性
底层靠对象监视器(ObjectMonitor)实现
每个Java对象内部都关联一个Monitor,它包含:持有线程标识、锁计数器、EntrySet(等待获取锁的线程队列)、WaitSet(调用wait后挂起的线程队列)。
- 线程执行synchronized代码块时,实际是在争夺该对象Monitor的所有权
- 获取成功 → 计数器+1,成为Owner;再次进入同一锁 → 计数器再+1(可重入)
- 退出同步块 → 计数器-1;归零时释放Monitor,唤醒EntrySet中一个线程竞争
锁状态会动态升级以优化性能
HotSpot虚拟机根据竞争激烈程度自动调整锁实现方式,全程无感但影响显著:
微信小程序公众号SaaS管理系统是一款完全开源的微信第三方管理系统,为中小企业提供最佳的小程序集中管理解决方案。可实现小程序的快速免审核注册(免300元审核费),可批量发布小程序模板,同步升级版本等功能。基础版本提供商城和扫码点餐两种小程序模板。商户端可以实现小程序页面模块化设计和自动生成小程序源代码并直接发布。
立即学习“Java免费学习笔记(深入)”;
- 无锁状态:对象未被锁定,Mark Word记录哈希码等信息
- 偏向锁:首次加锁仅记录线程ID,后续同一线程进入无需CAS竞争
- 轻量级锁:有竞争时升级,用CAS自旋尝试获取锁,避免阻塞开销
- 重量级锁:自旋失败或竞争持续,线程挂起进系统等待队列,由OS调度唤醒
同步语法对应不同锁对象
写法不同,锁定目标也不同,直接影响线程是否真正互斥:
-
实例方法:锁对象是
this,保护当前对象的临界资源 -
静态方法:锁对象是
类名.class,跨所有实例全局互斥 - 同步代码块:锁对象可任意指定(推荐私有final对象),粒度更可控,避免锁膨胀









