java死锁
死锁
多个线程各自战友一些资源,并且相互等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形。某一个同步块同时拥有两个以上对象的锁时,就可能会发生死锁问题。
形成死锁的四个必要条件:
- 互斥条件
- 请求与保持条件
- 不剥夺条件
- 循环等待条件
避免死锁:破坏形成死锁的四个必要条件其中任意一个就可以避免死锁的产生
package com.yuanyu.thread;
//死锁:多个对象持有对方需要的资源 相互僵持
public class DeadLock {
public static void main(String[] args) {
Makeup g1=new Makeup("xiaoming",0);
Makeup g2=new Makeup("xiaohong",1);
g1.start();
g2.start();
}
}
class LipStick{
}
class Mirror{
}
class Makeup extends Thread{
String name;
int choice;
Makeup(String name,int choice){
this.choice=choice;
this.name=name;
}
//需要的资源只有一份,用static来保证资源的唯一
static LipStick lipStick =new LipStick();
static Mirror mirror =new Mirror();
@Override
public void run() {
//化妆
makeup();
}
private void makeup(){
if (choice==0){
synchronized (lipStick){
System.out.println(this.name+"获得了口红的锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}synchronized (mirror){
System.out.println(this.name+"获得了镜子的锁");
}
}
}
else {
synchronized (mirror){
System.out.println(this.name+"获得了镜子的锁");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}synchronized (lipStick){
System.out.println(this.name+"获得了口红的锁");
}
}
}
}
}
程序形成死锁:
package com.yuanyu.thread;
//死锁:多个对象持有对方需要的资源 相互僵持
public class DeadLock {
public static void main(String[] args) {
Makeup g1=new Makeup("xiaoming",0);
Makeup g2=new Makeup("xiaohong",1);
g1.start();
g2.start();
}
}
class LipStick{
}
class Mirror{
}
class Makeup extends Thread{
String name;
int choice;
Makeup(String name,int choice){
this.choice=choice;
this.name=name;
}
//需要的资源只有一份,用static来保证资源的唯一
static LipStick lipStick =new LipStick();
static Mirror mirror =new Mirror();
@Override
public void run() {
//化妆
makeup();
}
private void makeup(){
if (choice==0){
synchronized (lipStick){
System.out.println(this.name+"获得了口红的锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (mirror){
System.out.println(this.name+"获得了镜子的锁");
}
}
else {
synchronized (mirror){
System.out.println(this.name+"获得了镜子的锁");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (lipStick){
System.out.println(this.name+"获得了口红的锁");
}
}
}
}
程序运行结果:死锁问题解决
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义