讲师中心 微信公众号
AI工具推荐 视频效率加速

Java怎么实现互斥锁 Java synchronized关键字用法【详解】

秋墨同学_7270

秋墨同学_7270

发布时间:2026-02-15 10:57:10

|

720人浏览过

|

来源于php中文网

原创

synchronized锁的是对象的监视器(monitor),不是代码、方法或变量本身;一个对象只有一个monitor,多线程竞争同一对象的synchronized才互斥,锁不同对象则完全不互斥。

java怎么实现互斥锁 java synchronized关键字用法【详解】

Java里synchronized到底锁的是谁

它锁的是对象的监视器(monitor),不是代码块、不是方法名、更不是变量本身。一个对象只有一个monitor,所以多个线程竞争同一个对象的synchronized方法或代码块时才会互斥;如果锁的是不同对象,哪怕代码一模一样,也完全不互斥。

常见误判场景:

  • 写 synchronized(this),但每次 new 一个新实例,等于每条线程都拿自己的锁,毫无互斥效果
  • 静态方法用 synchronized,实际锁的是当前类的 Class 对象(如 MyClass.class),和实例方法的锁完全无关
  • 在 Spring 管理的 Bean 中,若作用域是 prototype,每个请求拿到的都是新对象,synchronized 实际失效

synchronized 方法 vs synchronized(this) 代码块

二者语义等价,但粒度和可读性差异明显。方法级锁会把整个方法体包进去,哪怕只有几行需要保护,也会拖慢其他不相关逻辑;而代码块可以精确控制临界区范围。

实操建议:

立即学习“Java免费学习笔记(深入)”;

  • 优先用 synchronized(this) 或 synchronized(shareLockObj) 显式指定锁对象,避免隐式锁带来的歧义
  • 不要在 public 方法上直接加 synchronized,除非你明确知道调用方共享的是同一实例
  • 若需保护静态资源(如缓存计数器),必须用 synchronized(MyClass.class),不能靠实例锁

示例:下面两段逻辑行为一致,但后者更清晰、更易维护

deep-java-review
deep-java-review

Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...

下载
public synchronized void increment() {
    count++;
}
public void increment() {
    synchronized(this) {
        count++;
    }
}

为什么synchronized有时像没起作用

最常被忽略的原因是锁对象不一致。比如以下典型错误:

  • 用字符串字面量当锁:synchronized("key") —— JVM 可能对相同字面量做字符串常量池优化,导致意外共享;更糟的是,其他代码也可能用同样字符串,引发跨模块干扰
  • 用可变对象当锁,且该对象被外部修改或重新赋值,导致后续同步块锁的是另一个对象
  • 在 getter/setter 中加 synchronized,但业务代码绕过这些方法直接操作字段(尤其在非 private 字段+非 final 场景下)

验证是否真互斥:可在临界区内加 Thread.sleep(100),再开两个线程反复调用,观察输出是否交错。交错即说明没锁住。

synchronized 和 ReentrantLock 的关键区别在哪

核心不是“哪个更好”,而是“能不能响应中断”“要不要超时”“是否需要条件队列”。synchronized 是 JVM 层原语,自动释放、不可中断、不支持超时;ReentrantLock 是 API 层实现,要手动 lock()/unlock(),但提供 tryLock(long, TimeUnit) 和 newCondition()。

选型判断点:

  • 简单同步、无复杂等待逻辑 → 用 synchronized,JVM 优化成熟(偏向锁、轻量级锁、重量级锁升级路径清晰)
  • 需要中断等待线程(如任务取消)、或必须限定等待时间 → 必须用 ReentrantLock
  • 要实现多路等待(如生产者/消费者共用一个锁但分不同条件)→ 只能用 ReentrantLock.newCondition()

注意:synchronized 不可重入?错。它是可重入的——同一个线程可多次进入自己已持有的锁,计数器累加,退出时逐层减。

真正难的从来不是语法,而是确认你锁的那个对象,在所有并发路径中是否始终是同一个、是否被意外暴露或替换。

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2251

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

437

2026.01.26

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5844

2023.10.24

字符串常量的表示方法
字符串常量的表示方法

字符串常量的表示方法:1、使用引号;2、转义字符;3、多行字符串;4、原始字符串;5、字符串连接;6、字符串字面量和对象;7、编码问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

883

2023.12.26

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1578

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2344

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5844

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5029

2023.11.24

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn