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.mzph.cn/news/1119870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习毕设选题推荐:基于python深度学习的树叶健康识别人工智能

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Java 对接 PLC 实战:西门子 PLC 与永宏 PLC 通讯方式全面对比

下面这篇按“从 0 到能跑通”的思路,把 西门子(Siemens)PLC 和 永宏(FATEK/永宏电机)PLC 在 用 Java 对接硬件 时的差异讲清楚:差异到底来自哪里、配置要点是什么、代码通常怎么写、踩坑点有哪些。读完你应…

入校申报审批系统的设计与实现毕业论文+PPT(附源代码+演示视频)

文章目录入校申报审批系统的设计与实现一、项目简介(源代码在文末)1.运行视频2.🚀 项目技术栈3.✅ 环境要求说明4.包含的文件列表(含论文)数据库结构与测试用例系统功能结构后端运行截图项目部署源码下载入校申报审批系…

化工TPM预防性维护落地指南:从0到1实现故障降40%

作为化工企业的工程技术人员,你是否经常面临这样的困境:设备故障突发难以预判,熬夜抢修成为常态;维护计划缺乏针对性,过度维护浪费资源、维护不足引发故障。其实,通过科学搭建TPM预防性维护体系&#xff0c…

一篇讲透:芋道源码中的「租户」是如何通过程序控制的?

一、先别急着看代码:什么是「租户」? 1️⃣ 什么是租户(Tenant)? 在 SaaS 系统 中:租户 一套系统的一个“客户单位”举几个直观例子:一个 OA 系统 A 公司是一位租户B 公司是另一位租户一个进销…

凤希AI伴侣开发手记:那些只有深度使用才暴露的“缺点”

大家好,我是凤希。现在是2026年1月6号晚上七点多,我才开始整理昨天的工作。这几天,我的作息完全颠倒了,经常早上七八点才睡,下午四点才起,活脱脱一个“美国时间”。为啥?因为这几天我几乎把所有…

计算机深度学习毕设实战-基于python深度学习的树叶健康识别机器学习

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

芋道(Ruoyi-Vue-Pro)对接腾讯云短信:没配回调URL,为啥也能看到发送成功/失败?如何排查?

很多人第一次把芋道(Ruoyi-Vue-Pro / 芋道源码)接到腾讯云短信时,都会遇到一个“看起来矛盾”的现象:我在芋道里没有配置短信回调 URL但在【短信日志】里却能看到: ✅ 发送成功❌ 发送失败同时【接收状态】又常常显示“…

Memcached vs Redis:面试必看的彻底解析

文章目录Memcached 与 Redis 的区别?闫工来告诉你!一、Memcached:轻量级缓存界的“闪电侠”1.1 Memcached 的特点1.2 Memcached 的适用场景1.3 Memcached 的配置与使用示例二、Redis:全能型的“瑞士军刀”2.1 Redis 的特点2.2 Red…

ZGLanguage 解析SQL数据血缘 之 提取子查询语句中的源表名

# 假设存在 子查询SQL代码 如下:SELECT CL.OBJECTNO, PP.PAYDATEFROM NYBDP.O_SS_CL_LOAN_ACCT_STATIS CLLEFT JOIN (SELECT AL.PAYDATE, BC.BUSS_NOFROM O_CWWS_ACCT_LOAN ALINNER JOIN NYBDP.O_CWWS_BUSINESS_DUEBILL BDON 11LEFT JOIN O_CWWS_BUSINESS_CONTRACT …

typescript-var和let作用域

什么是作用域?作用域可以理解为某个变量在某个范围内是可以访问到。var是函数作用域(声明的函数内)、全局作用域(在哪里都可以访问到)let是块级作用域(即程序中的大括号{}包含的范围内)看下面的…

高精度双极板体积电阻率测试仪

高精度双极板体积电阻率测试仪 说明高精度双极板体积电阻率测试仪①电阻率ρ不仅和导体的材料有关,还和导体的温度有关。在温度变化不大的范围内,几乎所有金属的电阻率随温度作线性变化,即ρρo(1at)。式中t是摄氏温度,ρo是O℃时…

2026年香港服务器走CN2线路具有哪些优势?

2026 年香港服务器走 CN2 线路具有哪些优势?先说 CN2,CN2 线路作为中国电信的优质网络通道,通过独立路由和优先级保障,为香港服务器赋予了显著优势。1.速度优势:低延迟与高带宽的完美结合CN2线路通过优化路由跳转,大幅…

2026年香港服务器走CN2线路具有哪些优势?

2026 年香港服务器走 CN2 线路具有哪些优势?先说 CN2,CN2 线路作为中国电信的优质网络通道,通过独立路由和优先级保障,为香港服务器赋予了显著优势。1.速度优势:低延迟与高带宽的完美结合CN2线路通过优化路由跳转,大幅…

都在做「WAN优化」,南凌科技的方案究竟有何不同?

在企业数字化转型过程中,WAN优化已成为常见需求。面对市场上众多看似雷同的“降本增效”方案,IT管理者往往难以抉择:究竟哪家能真正解决问题?事实上,许多传统WAN优化方案仅从单点入手,例如数据压缩或协议加…

香港服务器为何需要IPMI?好用吗

在当今数字化时代,香港作为全球重要的数据中心枢纽,其服务器托管服务备受企业青睐。对于使用香港服务器的用户而言,IPMI(智能平台管理接口)是一个关键且实用的技术工具。那么,香港服务器为何需要IPMI?它又是否好用呢?香港服务器…

彻底解决启动问题:如何修复错误代码0xc000000e一站式教程

遇到错误代码0xc000000e可能意味着您的系统启动文件有问题,这可能导致电脑无法正常启动。本文将详细介绍错误代码0xc000000e的原因及其修复方法,帮助您快速恢复电脑正常使用。错误代码0xc000000e通常与什么系统问题相关?1.启动配置数据&#…

喜报!这3本SCI/ESCI成功解除“On Hold”!

据科睿唯安数据库全年更新记录统计,2025年度共668本期刊的变动。其中,新增收录期刊481本,被剔除期刊129本,名称变更期刊58本。被剔除的期刊中:• ESCI:93本(占比最高,主要剔除区域&a…

【心脏病检测】基于matlab GUI检测胎儿心脏病【含Matlab源码 14854期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞&#x1f49…

云原生ETL方案:AWS Glue vs Azure Data Factory

云原生ETL方案:AWS Glue vs Azure Data Factory 关键词:云原生、ETL、AWS Glue、Azure Data Factory、数据处理 摘要:本文旨在对比云原生环境下的两大ETL方案——AWS Glue和Azure Data Factory。我们将深入剖析它们的核心概念、工作原理、算法…