当前位置: 首页 > news >正文

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并发问题和避免死锁的关键!

http://www.jsqmd.com/news/206503/

相关文章:

  • 深度学习毕设选题推荐:基于python深度学习的树叶健康识别人工智能
  • Java 对接 PLC 实战:西门子 PLC 与永宏 PLC 通讯方式全面对比
  • 入校申报审批系统的设计与实现毕业论文+PPT(附源代码+演示视频)
  • 化工TPM预防性维护落地指南:从0到1实现故障降40%
  • Katalon StudioAssist:智能化测试助手
  • 一篇讲透:芋道源码中的「租户」是如何通过程序控制的?
  • 凤希AI伴侣开发手记:那些只有深度使用才暴露的“缺点”
  • 计算机深度学习毕设实战-基于python深度学习的树叶健康识别机器学习
  • Memcached vs Redis:面试必看的彻底解析
  • 芋道(Ruoyi-Vue-Pro)对接腾讯云短信:没配回调URL,为啥也能看到发送成功/失败?如何排查?
  • ZGLanguage 解析SQL数据血缘 之 提取子查询语句中的源表名
  • ZGLanguage 解析SQL数据血缘 之 提取子查询语句中的源表名
  • typescript-var和let作用域
  • 2026年香港服务器走CN2线路具有哪些优势?
  • 2026年香港服务器走CN2线路具有哪些优势?
  • 都在做「WAN优化」,南凌科技的方案究竟有何不同?
  • 香港服务器为何需要IPMI?好用吗
  • 彻底解决启动问题:如何修复错误代码0xc000000e一站式教程
  • 云原生ETL方案:AWS Glue vs Azure Data Factory
  • 免费听书神器喜马拉雅v9.4.32.3精简版分享 解锁付费内容 无限畅听
  • 牛批了,Windows搬家神器
  • FTP登陆工具SmartFTP Client Enterprise v10.0.3300 多语便携版下载 FTP文件传输神器
  • Katalon StudioAssist Ask模式:工作区内的AI测试助手
  • 如何打开大文件不崩溃不卡顿?EmEditor v25.4.4绿色便携版下载
  • 敏捷的质量合伙人
  • php+nginx在cookie中设置了HttpOnly属性
  • 2026必备!本科生论文写作软件TOP9测评
  • 黑马反弹抄底之短炒选股指标公式
  • NVIDIA Rubin平台重磅亮相CES:六芯协同重塑AI算力,2026下半年量产落地
  • 基于SpringBoot的车辆报废回收系统(源码+lw+部署文档+讲解等)