JavaSE 基础 第60节 死锁问题
2016-07-02
1 死锁问题
线程A现在占用资源2,需要请求资源1
线程B现在占用资源1,需要请求资源2
线程2获得了资源2
线程1获得了资源1
线程3获得了资源3
线程3在等待资源1
线程1在等待资源2
线程2在等待资源3
package com.java1995; /** * 资源类 * @author Administrator * */ public class Resource { String resourceName; public Resource(String resourceName){ this.resourceName=resourceName; } }
package com.java1995; /** * 线程类 * @author Administrator * */ public class MyThread extends Thread{ Resource r1; Resource r2; MyThread(Resource r1,Resource r2,String name){ super(name); this.r1=r1; this.r2=r2; } public void run(){ synchronized (r1) { System.out.println(this.getName()+"获得了"+r1.resourceName); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.getName()+"在等待"+r2.resourceName); synchronized (r2) { System.out.println(this.getName()+"获得了"+r2.resourceName); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
package com.java1995; /** * 测试类 * @author Administrator * */ public class Test { public static void main(String[] args) { Resource rs1=new Resource("资源1"); Resource rs2=new Resource("资源2"); Resource rs3=new Resource("资源3"); MyThread t1=new MyThread(rs1,rs2,"线程1"); MyThread t2=new MyThread(rs2,rs3,"线程2"); MyThread t3=new MyThread(rs3,rs1,"线程3"); t1.start(); t2.start(); t3.start(); } }
【参考资料】
分类:
Java
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用