Java 死锁编码及定位分析

前言

对于java中死锁的学习,予以记录!

一、什么是死锁?

1、概念

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象

若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能得到满足,死锁出现的可能性就很低。否则就会因争夺有限的资源而陷入死锁。

在这里插入图片描述

2、产生死锁的主要原因

  1. 系统资源不足
  2. 进程运行推进的顺序不合适
  3. 资源分配不当

3、死锁产生的必要条件:互斥、请求保持、不可抢占与循环等待

  1. 互斥条件:进程对所分配到的资源进行排它性使用,即在一段时间内,某资源只能被一个进程占用。如果此时还有其它进程请求该资源,则请求进程只能等待,直至占有该资源的进程用毕释放。

  2. 请求保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程被阻塞,但又对自己以获得的资源保持不变。

  3. 不可抢占条件:进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时由自己释放。

  4. 循环等待条件:在发生死锁时,必定存在一个由进程构成的资源循环链(进程集合{P0,P1,P2,…,Pn}中的P0正在等待一个P1占用的资源,P1正在等待P2占用的资源,…,Pn正在等待P0占用的资源)。

二、写一个死锁Demo

class ShareDeadLock implements Runnable{
    private String lockA;
    private String lockB;

    public ShareDeadLock(String lockA, String lockB) {
        this.lockA = lockA;
        this.lockB = lockB;
    }
    @Override
    public void run() {
        synchronized (lockA){
            System.out.println(Thread.currentThread().getName()+"\t持有锁:"+lockA+"尝试获得锁:"+lockB);
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lockB){
                System.out.println(Thread.currentThread().getName()+"\t持有锁:"+lockB+"尝试获得锁:"+lockA);
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
public class DeadLock {
    public static void main(String[] args) {
        String lockA="lockA";
        String lockB="lockB";
        new Thread(new ShareDeadLock(lockA,lockB),"ThreadAAA").start();
        new Thread(new ShareDeadLock(lockB,lockA),"ThreadBBB").start();
    }
}

在这里插入图片描述

三、如何定位死锁?

1、jps -l:确定进程号

在这里插入图片描述

2、jstack 进程号:定位死锁

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

3、jconsole图形化界面监视管理控制台

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值