您的位置 首页 java

Java多线程 演示死锁的发生

演示死锁的发生

如下的代码演示了死锁的发生.
在run方法中, flag等于1 的时候, 线程1 ,获得了锁1, 需要拿到锁2 . flag等于2的时候, 线程2获得了锁2 ,需要拿到锁1,
创建两个线程的时候, 给线程1的flag赋值为1 , 线程2赋值为2.

这样创建线程, 启动线程的时候, 线程1 和2 分别拥有了锁1 和2 ,但是 同时又需要拿到锁2和1 . 线程1和2也没有释放锁1和2. 这样就造成了相互等待锁资源,造成了死锁的发生.

 package com.thread.background;

/**
 * 类名称:DeadLockDemo
 * 类描述: 线程安全问题,演示死锁。
 *
 * @author: 
 * 创建时间:2020/9/1 7:22
 * Version 1.0
 */public class DeadLockDemo implements Runnable {
    int flag = 1;

    //两把锁
    static Object o1 = new Object();
    static Object o2 = new Object();

    public static void main(String[] args) {
        DeadLockDemo r1 = new DeadLockDemo();
        DeadLockDemo r2 = new DeadLockDemo();

        r1.flag=1;
        r2.flag=2;

        new Thread(r1,"thread1").start();
        new Thread(r2,"thread2").start();
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+ " flag = " + flag);

        if (flag == 1) {
            //获取第一把锁
            synchronized (o1) {

                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //获取第二把锁
                synchronized (o2) {
                    System.out.println("1");
                }
            }
        }

        if (flag == 2) {
            //获取第一把锁
            synchronized (o2) {
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //获取第二把锁
                synchronized (o1) {
                    System.out.println("2");
                }
            }
        }

    }


}
  

运行程序可以看到线程1和2 分别进入run方法打印了输出语句之后, 就进入了死锁的阶段.
控制台的红色按钮一直亮着 ,说明程序一直在运行中, 发生了死锁.

文章来源:智云一二三科技

文章标题:Java多线程 演示死锁的发生

文章地址:https://www.zhihuclub.com/179548.shtml

关于作者: 智云科技

热门文章

网站地图