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();
    }
}
复制代码

 

posted @   Mars.wang  阅读(190)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示