news 2026/6/10 18:23:05

Java中的锁对象详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java中的锁对象详解

锁是什么?

1.对于实例方法(非static)

publicclassDemo{// 实例方法上的synchronizedpublicsynchronizedvoidmethodA(){methodB();// 调用另一个synchronized方法}publicsynchronizedvoidmethodB(){// ...}}

锁对象 = 当前实例对象(this)

示例:

Demodemo1=newDemo();Demodemo2=newDemo();// demo1.methodA() 和 demo1.methodB() 使用 demo1 作为锁// demo2.methodA() 和 demo2.methodB() 使用 demo2 作为锁// demo1和demo2之间互不影响,因为它们使用不同的锁对象

2.对于静态方法(static)

publicclassDemo{// 静态方法上的synchronizedpublicstaticsynchronizedvoidstaticMethodA(){staticMethodB();// 调用另一个静态synchronized方法}publicstaticsynchronizedvoidstaticMethodB(){// ...}}

锁对象 = 类的Class对象(Demo.class)

3.对于同步代码块

publicclassDemo{privatefinalObjectlock=newObject();publicvoidmethodA(){synchronized(lock){// 使用lock对象作为锁// ...}}publicvoidmethodB(){synchronized(lock){// 使用同一个lock对象作为锁// ...}}}

锁对象 = synchronized括号里指定的对象

验证示例

publicclassLockIdentityDemo{// 实例同步方法publicsynchronizedvoidinstanceMethodA(){System.out.println("methodA锁对象: "+this);instanceMethodB();}publicsynchronizedvoidinstanceMethodB(){System.out.println("methodB锁对象: "+this);}// 静态同步方法publicstaticsynchronizedvoidstaticMethodA(){System.out.println("staticMethodA锁对象: "+LockIdentityDemo.class);staticMethodB();}publicstaticsynchronizedvoidstaticMethodB(){System.out.println("staticMethodB锁对象: "+LockIdentityDemo.class);}publicstaticvoidmain(String[]args){LockIdentityDemodemo1=newLockIdentityDemo();LockIdentityDemodemo2=newLockIdentityDemo();System.out.println("=== 测试实例方法 ===");System.out.println("demo1对象: "+demo1);System.out.println("demo2对象: "+demo2);newThread(()->demo1.instanceMethodA()).start();newThread(()->demo2.instanceMethodA()).start();System.out.println("\n=== 测试静态方法 ===");newThread(()->LockIdentityDemo.staticMethodA()).start();}}

锁的作用范围表格

同步方式锁对象影响范围示例
synchronized 实例方法当前对象(this)该实例的所有synchronized实例方法demo.methodA()会阻塞demo.methodB()
synchronized static方法类的Class对象该类的所有synchronized static方法Demo.staticMethodA()会阻塞Demo.staticMethodB()
synchronized(this)当前对象(this)该实例的所有同步块与实例方法互斥
synchronized(Class)类的Class对象该类的所有相关同步与static方法互斥
synchronized(obj)指定对象obj所有同步该对象的代码自定义锁对象

重要规则

  1. 同一个锁对象才会产生互斥

    Demoobj1=newDemo();Demoobj2=newDemo();// 这两个调用不会互相阻塞,因为锁对象不同obj1.syncMethod();// 锁是obj1obj2.syncMethod();// 锁是obj2
  2. 不同类型的方法使用不同的锁

    publicclassDemo{publicsynchronizedvoidinstanceMethod(){}// 锁:thispublicstaticsynchronizedvoidstaticMethod(){}// 锁:Demo.classpublicvoidtest(){// 这两个方法不会互相阻塞!instanceMethod();// 锁thisstaticMethod();// 锁Demo.class}}
  3. 锁的粒度控制

    publicclassBankAccount{privatefinalObjectreadLock=newObject();privatefinalObjectwriteLock=newObject();publicvoidread(){synchronized(readLock){// 读锁// 多个线程可以同时读}}publicvoidwrite(){synchronized(writeLock){// 写锁// 写操作互斥}}}

实际应用建议

  1. 明确指定锁对象:使用同步代码块比同步方法更灵活
  2. 减小锁粒度:使用不同的锁保护不同的资源
  3. 避免锁混淆:注意实例锁和类锁的区别
  4. 文档说明:在代码中注释说明使用的锁对象

理解"锁是什么对象"是解决Java并发问题和避免死锁的关键!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 13:34:39

notebook的图显示中文的设置

apt updateapt install -y fonts-wqy-microheifc-list | grep -E “WenQuanYi|Noto”清楚缓存 import matplotlib import os import shutil# 获取matplotlib缓存目录 cache_dir matplotlib.get_cachedir() print(f"Matplotlib缓存目录:{cache_dir}")# …

作者头像 李华
网站建设 2026/6/10 10:13:35

一文带你快速了解大模型蒸馏

一文搞懂大模型蒸馏 前言 如今,大模型在自然语言处理、计算机视觉等领域展现出惊人的能力,能处理复杂的任务、输出高质量的结果。但与此同时,大模型的“重量级”特性也带来了不少麻烦:动辄数十亿、上万亿的参数量,需要…

作者头像 李华
网站建设 2026/6/10 10:14:03

NVIDIA Rubin平台重磅亮相CES:六芯协同重塑AI算力,2026下半年量产落地

从行业演进视角来看,CES虽仍冠以消费电子展之名,但如今已成为科技巨头发布前沿算力技术的重要阵地,其技术辐射范围早已突破消费端边界。NVIDIA作为AI算力领域的领军者,此次率先召开芯片厂商发布会,重磅推出下一代Rubin…

作者头像 李华
网站建设 2026/6/10 10:13:12

中小企业服务器托管哪家好?尚航科技综合实力解析

数字化浪潮下,选择一家靠谱的服务器托管商,对中小企业来说至关重要。对于中小企业而言,服务器托管不仅是将服务器放在机房那么简单,它关系到业务连续性、数据安全性和长期成本控制。一个好的IDC服务商能够为企业提供稳定可靠的数字…

作者头像 李华
网站建设 2026/6/10 10:11:59

北京楚珩医疗科技有限公司如何推动新中医事业发展?

公司通过技术创新 、学术创新 ,深入中医行业 ,做新中医医疗领域领导者 。公司与各大三甲医院权威中医专家合作整理 、持续创新出更加全面的皮内针临床治疗方案 ,通过学术交流 、技术培训等方式 ,将成熟的实操技术从专业领域普及到…

作者头像 李华
网站建设 2026/6/10 10:14:56

【后端开发面试高频场景题设计题】深度解析| 面试全覆盖

文章目录目录一、 压轴高频场景题深度解析1.1 分布式缓存与数据库的数据一致性保障方案问题描述分析思路参考答案面试考察点面试追问1.2 数据库读写分离方案与实践问题描述分析思路参考答案1.2.1 读写分离核心架构对比1.2.2 主从同步方式对比1.2.3 主从同步延迟的解决方案面试考…

作者头像 李华