多线程之死锁

Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成。在多线程技术中,“死锁”是必须避免的,因为这会造成线程“假死”。
测试代码:

package test;

/**
 * @Author LiBinquan
 */
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 ("A".equals(userName)){
            synchronized (lock1){
                try {
                    System.out.println("userName = " + userName);
                    Thread.sleep(3000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                synchronized (lock2){
                    System.out.println("按lock2 -> lock1 代码顺序执行了");
                }
            }
        }
        if ("B".equals(userName)){
            synchronized (lock2) {
                try{
                    System.out.println("userName = "+userName);
                    Thread.sleep(3000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                synchronized (lock1){
                    System.out.println("按lock2 -> lock1 代码顺序执行了");
                }
            }
        }
    }
}

运行类:

package test;

/**
 * @Author LiBinquan
 */
public class Run {
    public static void main(String[] args) throws InterruptedException {
        DealThread t1 = new DealThread();
        t1.setFlag("A");
        Thread thread1 = new Thread(t1);
        thread1.start();
        Thread.sleep(100);
        t1.setFlag("B");
        Thread thread2 = new Thread(t1);
        thread2.start();
    }
}

运行结果:
在这里插入图片描述
我这边使用JDK的安装目录里 执行jsp命令
在这里插入图片描述
得到运行的线程Run的id值是90966.在执行jstack命令,查看结果。
在这里插入图片描述
监测出有死锁现象。
死锁是线程涉及的BUG,在设计程序时就要避免双方互相持有对方的锁的情况。需要说明的是,本实验使用synchronized嵌套的代码结构来实现死锁,其实不使用嵌套的代码结构也会出现死锁,与嵌套不嵌套无任何的关系,不要被代码结构所误导。只要相互等待对方释放锁就有可能出现死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值