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

在Java中如何使用synchronized关键字_Java同步锁基本用法解析

梦萱酱_3274

梦萱酱_3274

发布时间:2026-02-11 12:28:33

|

638人浏览过

|

来源于php中文网

原创

synchronized修饰实例方法时锁的是this对象,若多线程操作不同实例则无互斥效果;保护静态共享状态需用类锁或静态同步方法,推荐私有final对象作为锁以避免外部干扰和死锁。

在java中如何使用synchronized关键字_java同步锁基本用法解析

为什么直接在方法上加 synchronized 有时不生效

因为 synchronized 修饰实例方法时,锁的是当前对象(this),不是类。如果多个线程操作的是不同实例,锁就互不干扰——看似加了锁,实际没串行。

  • 场景:创建了 new Counter() 两次,分别由两个线程调用其 increment() 方法 → 无锁竞争
  • 解决:想保护类级别的共享状态(如静态计数器),必须用 synchronized(Counter.class) 或修饰静态方法
  • 注意:synchronized 静态方法锁的是 Class 对象,和任何实例锁都不冲突,也不共享

synchronized(this) 和 synchronized(任意对象) 的区别

本质都是对“某个对象实例”加 monitor 锁,但选择哪个对象决定锁的粒度和安全性。

  • synchronized(this):锁当前实例,简单但危险——外部代码可能拿到 this 并也去同步它,导致死锁或意外阻塞
  • synchronized(lockObj):推荐用私有 final 对象(如 private final Object lock = new Object();),对外不可见,避免锁被误用
  • 别用字符串、常量或 getClass() 做锁对象——容易因字符串驻留或继承关系引发意外锁共享

同步代码块比同步方法更灵活,但要注意锁对象一致性

同步方法是语法糖,底层都转成 monitorenter/monitorexit 指令;同步代码块能精确控制临界区范围,减少锁持有时间。

java-enterprise
java-enterprise

Java企业开发专家,专注于Spring Boot、微服务架构和JVM优化。适用于:Java语言掌握、

下载
public void transfer(Account from, Account to, BigDecimal amount) {
    // 错误:按任意顺序锁,可能死锁
    synchronized(from) {
        synchronized(to) {
            from.withdraw(amount);
            to.deposit(amount);
        }
    }
}

public void transferSafe(Account from, Account to, BigDecimal amount) {
    // 正确:约定按 hashCode 顺序加锁,避免死锁
    Object firstLock = from.hashCode() < to.hashCode() ? from : to;
    Object secondLock = from.hashCode() < to.hashCode() ? to : from;
    synchronized(firstLock) {
        synchronized(secondLock) {
            from.withdraw(amount);
            to.deposit(amount);
        }
    }
}
  • 同步方法无法拆分临界区,哪怕只有几行需要保护,整个方法都会被阻塞
  • 多个同步块若使用不同锁对象,彼此不互斥——必须确保所有访问同一共享资源的路径,都用同一个锁对象
  • 锁对象一旦确定,就不能为 null,否则抛 NullPointerException

同步锁不能继承、不能中断、也不能超时

synchronized 是 JVM 原生实现的独占锁,没有高级特性。遇到需要响应中断、设定超时、或尝试非阻塞获取的场景,就得换 java.util.concurrent.locks.ReentrantLock。

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

  • 无法中断正在等待 synchronized 锁的线程(Thread.interrupt() 无效)
  • 没有 tryLock(long timeout, TimeUnit unit) 这类机制,容易无限等待
  • 不支持条件队列的多路等待(ReentrantLock.newCondition() 可以配多个 Condition)
  • 但优点是简洁、不易出错、JVM 优化成熟——简单场景优先用 synchronized,复杂需求再切到 Lock
真正容易被忽略的是:锁的语义完全取决于你选的对象和作用域。写 synchronized 很快,但判断“这里该锁谁、锁多久、有没有被其他地方悄悄共用了同一个锁”,才决定它到底起不起作用。

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

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

WorkBuddy

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

蛙蛙写作

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

PixPix
PixPix Hot

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1678

2024.03.01

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

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

5984

2023.10.24

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

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

1678

2023.08.03

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

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

2564

2023.09.04

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

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

5984

2023.10.24

字符串介绍
字符串介绍

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

5449

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7134

2024.03.22

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

80

2026.10.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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