25.死锁

一个线程如果需要同时获取多把锁,就容易产生死锁。

t1线程获得A对象锁,接下来想获取B对象的锁。

t2线程获得B对象锁,接下来想获取A对象的锁。

/**
     * 死锁demo
     * @param args
     */
    public static void main(String[] args) {
        Object a = new Object();
        Object b = new Object();
        new Thread(() -> {
            synchronized (a) {
                log.info("lock a");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (b) {
                    log.info("lock b...");
                }
            }
        }, "t1").start();

        new Thread(() -> {
            synchronized (b) {
                log.info("lock b");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (a) {
                    log.info("lock a...");
                }
            }
        }).start();
    }

使用工具定位死锁:

cmd下的jps命令,可以查看当前正在运行的java进程

工具一:jstack命令 

可以定位到具体的代码行数: 

工具二:jconsole

经典死锁案例:五位哲学家五根筷子吃饭

public class DeadLockDemo {

    public static void main(String[] args) {
        Chopstick chopstick1 = new Chopstick("1");
        Chopstick chopstick2 = new Chopstick("2");
        Chopstick chopstick3 = new Chopstick("3");
        Chopstick chopstick4 = new Chopstick("4");
        Chopstick chopstick5 = new Chopstick("5");

        new Philosopher("哲学家1", chopstick1, chopstick2).start();
        new Philosopher("哲学家2", chopstick2, chopstick3).start();
        new Philosopher("哲学家3", chopstick3, chopstick4).start();
        new Philosopher("哲学家4", chopstick4, chopstick5).start();
        new Philosopher("哲学家5", chopstick5, chopstick1).start();
    }
}

@Slf4j
class Philosopher extends Thread {

    //左边的筷子
    Chopstick left;
    //右边的筷子
    Chopstick right;

    public Philosopher(String name, Chopstick left, Chopstick right) {
        super(name);//设置线程名称
        this.left = left;
        this.right = right;
    }

    @Override
    public void run() {
        while (true) {//这里意思是一位哲学家获取了两根筷子后吃完饭,又重新开始下一轮...
            synchronized (left) {
                synchronized (right) {
                    eat();
                }
            }
        }

    }

    private void eat() {
        log.info("eat...");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 筷子类
 */
class Chopstick {

    //名称
    private String name;

    public Chopstick(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Chopstick{" +
                "name='" + name + '\'' +
                '}';
    }
}

相关推荐

  1. <span style='color:red;'>25</span>.<span style='color:red;'>死</span><span style='color:red;'>锁</span>

    25.

    2024-04-02 14:28:06      4 阅读
  2. 以及如何避免

    2024-04-02 14:28:06       4 阅读
  3. 问题,4个必要条件+避免

    2024-04-02 14:28:06       27 阅读

最近更新

  1. leetcode705-Design HashSet

    2024-04-02 14:28:06       8 阅读
  2. Unity发布webgl之后打开streamingAssets中的html文件

    2024-04-02 14:28:06       8 阅读
  3. vue3、vue2中nextTick源码解析

    2024-04-02 14:28:06       9 阅读
  4. 高级IO——React服务器简单实现

    2024-04-02 14:28:06       8 阅读
  5. 将图片数据转换为张量(Go并发处理)

    2024-04-02 14:28:06       7 阅读
  6. go第三方库go.uber.org介绍

    2024-04-02 14:28:06       8 阅读
  7. 前后端AES对称加密 前端TS 后端Go

    2024-04-02 14:28:06       10 阅读

热门阅读

  1. Git 实战教程

    2024-04-02 14:28:06       7 阅读
  2. 数据流模型——【数据科学与工程算法基础】

    2024-04-02 14:28:06       5 阅读
  3. CPU狂飙900%,该怎么处理

    2024-04-02 14:28:06       3 阅读
  4. 【OpenCV进阶】图像中添加中文字幕

    2024-04-02 14:28:06       6 阅读
  5. 低代码与系统集成:革新企业应用开发的新动力

    2024-04-02 14:28:06       3 阅读
  6. MYSQL08_页的概述、内部结构、行格式

    2024-04-02 14:28:06       5 阅读
  7. 面试中的MVCC到底是什么意思?

    2024-04-02 14:28:06       4 阅读
  8. Spring与SpringMVC常用注解

    2024-04-02 14:28:06       6 阅读
  9. elasticsearch之多条件查询

    2024-04-02 14:28:06       5 阅读
  10. Redis

    Redis

    2024-04-02 14:28:06      3 阅读
  11. 递归---算法

    2024-04-02 14:28:06       7 阅读
  12. 2024最新华为OD机试试题库全 -【符号运算】- C卷

    2024-04-02 14:28:06       4 阅读