java多线程之死锁
死锁在并发编程中是需要避免的,要修正死锁问题,必须明白死锁发生的条件:
1.互斥条件:
任务中使用的资源至少有一个是不能共享的
2.请求与保持条件:
一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:
进程已获得的资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:
若干进程之间形成一种头尾相接的循环等待资源关系。
下面我们着手实现一个死锁:
public class DeadThread implements Runnable { public String username; public Object lock1=new Object(); public Object lock2=new Object(); public void setFlag(String username){ this.username=username; } @Override public void run() { if(username.equals("a")){ synchronized (lock1){ try { System.out.println("username="+username); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2){ System.out.println("按lock1->lock2顺序执行了"); } } } if(username.equals("b")){ synchronized (lock2){ try { System.out.println("username="+username); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock1){ System.out.println("按lock2->lock1顺序执行了"); } } } } } public class Run { public static void main(String[] args) { DeadThread d1=new DeadThread(); d1.setFlag("a"); Thread t1=new Thread(d1); t1.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } d1.setFlag("b"); Thread t2 = new Thread(d1); t2.start(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗