多线程的死锁程序

线程A和线程B相互等待对方持有的锁导致程序无限死循环下去,要理解什么是死锁,首先要理解死锁的形成步骤:
(1)两个线程里面分别持有两个Object对象:lock1和lock2。这两个lock作为同步代码块的锁;
(2)线程1的run()方法中同步代码块先获取lock1的对象锁,Thread.sleep(3000),然后接着获取lock2的对象锁。这么做主要是为了防止线程1启动一下子就连续获得了lock1和lock2两个对象的对象锁;
(3)线程2的run()方法中同步代码块先获取lock2的对象锁,接着获取lock1的对象锁,当然这时lock1的对象锁已经被线程1锁持有,线程2肯定是要等待线程1释放lock1的对象锁;
这样,线程1“睡觉”结束,线程2已经获取了lock2的对象锁了,线程1此时尝试获取lock2的对象锁,便被阻塞,此时一个死锁就形成了。

public class DealThread 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 static void main(String[] args){
        try {
            DealThread t1 = new DealThread();

            t1.setFlag("A");
            Thread thread1 = new Thread(t1);
            thread1.start();
            Thread.sleep(500);

            t1.setFlag("B");
            Thread thread2 = new Thread(t1);
            thread2.start();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

程序运行结果如图所示:
这里写图片描述

进入cmd控制台,再进入JDK的安装文件夹中的bin目录,执行jps命令,查看如图所示:
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值