synchronized父子类对象锁重入
synchronize必须是重入锁,为什么呢? 就是因为父子类不会破坏继承基础思想:
父子类对象锁重入的意思是子类的同步方法调用了父类的同步方法同样不需要再去竞争锁,因为该线程已经拥有了该对象的锁,子类对象继承了父类的方法。
我们看下代码:
父类:
package com.ck.thread; public class Father { public synchronized void eat() { System.out.println("Father:吃饭"); xiwan(); System.out.println("Father:吃饭整个过程结束"); } public synchronized void xiwan() { System.out.println("Father:洗碗"); } }
子类中的洗手吃饭方法调用了父类的吃饭方法:
package com.ck.thread; public class Son extends Father{ public synchronized void xishouEat() { System.out.println("son : 洗手"); /** * 吃饭之前先洗手,洗完手再吃饭 */ eat(); } }
然后我们修改下吃饭的线程类:
package com.ck.thread; public class EatThread extends Thread{ private Son son; public EatThread(Son son) { super(); this.son = son; } public Son getSon() { return son; } public void setFather(Son son) { this.son = son; } @Override public void run() { son.xishouEat(); } }
执行主方法:
package com.ck.thread; public class MainThread { public static void main(String[] args) throws InterruptedException { Son son = new Son(); EatThread eatThread = new EatThread(son); eatThread.start(); } }
执行结果:
son : 洗手
Father:吃饭
Father:洗碗
Father:吃饭整个过程结束
总结:通过上面例子我们可以看到 xishouEat 方法调用父类eat方法的时候,可以直接调用,不需要等待,这就是synchronized 父子类锁重入 ,因为子类继承了父类实际上就是拥有了父类的public方法,所有父类的public 方法也属于子类对象。同一个对象同步方法调用就是我们上一篇讲的内容,同一个对象拥有了同一把锁,不需要竞争。
分类:
线程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具