JUC - 死锁

1 概念

多个进程互相持有资源,且相互等待资源释放,导致程序僵持。

2 死锁的必要条件

(1)互斥条件
资源同一时间必须只能被一个线程使用,其他线程想要访问必须等待
(2)请求和保持条件
线程在占有资源的情况下,申请新的资源,但不释放已占有资源
(3)不可剥夺条件
线程在占有资源的情况下,不能对该资源进行强制获取,必须等待其释放
(4)循环等待条件
多个线程互相持有其他线程所需要的资源的同时,又等待其他被占有的资源

3 避免死锁

多线程下,并发安全问题导致我们不能打破互斥条件,所以我们为了避免死锁就从剩下三个条件出发。
(1)打破请求和保持条件
资源必须一次性申请完,要么同时占有,要么同时释放
(2)打破不可剥夺条件
线程请求不到所有资源时,就进入等待状态,并且释放其占有的所有资源
(3)打破循环等待条件
采用资源有序分配:将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的资源才能申请较大编号的资源

4 定位死锁

一个死锁例子

	  Object A = new Object();
      Object B = new Object();

      Thread t1 = new Thread(() -> {
          log.info("t1 start...");
          synchronized (A) {
              log.info("t1 get A");
              synchronized (B) {
                  log.info("t1 get B");
              }
          }
      }, "t1");

      Thread t2 = new Thread(() -> {
          log.info("t2 start...");
          synchronized (B) {
              log.info("t2 get B");
              synchronized (A) {
                  log.info("t2 get A");
              }
          }
      }, "t2");
      t1.start();
      t2.start();

4.1 jstack

(1)jps查看当前 java 进程
获取当前进程ID
在这里插入图片描述
(2)jstack 查看线程信息
可以看到两个线程阻塞状态,互相等待
在这里插入图片描述
死锁线程列举
在这里插入图片描述

4.2 jconsole

在这里插入图片描述
在这里插入图片描述

5 哲学家就餐

5.1 介绍

五个科学家就餐,围在圆桌前

  • 他们只做两件事,吃饭和思考,思考一会吃一口饭
  • 吃饭需要两根筷子,桌子上两根筷子,每位科学家左右手边各有一根筷子
  • 如果筷子被身边的人拿着,自己就等待
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值