死锁编码及定位分析

什么是死锁

死锁是指两个或以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。若无外力干涉将无法推进,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。

产生死锁的主要原因

  • 系统资源不足
  • 进程运行推进的顺序不合适
  • 资源分配不当

产生死锁的必要条件

  • 互斥访问
  • 请求并保持
  • 循环等待
  • 不可剥夺

代码实现

package com.company;

import java.util.concurrent.TimeUnit;

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

    public HoldLock(String lockA,String lockB){
        this.lockA = lockA;
        this.lockB = lockB;
    }

    @Override
    public void run() {
        synchronized (lockA){
            System.out.println(Thread.currentThread().getName()+"\t自己持有"+lockA+"\t尝试获得"+lockB);
            try{TimeUnit.SECONDS.sleep(2);}catch (InterruptedException e){e.printStackTrace();}
            synchronized (lockB){
                System.out.println(Thread.currentThread().getName()+"\t自己持有"+lockB+"\t然后又获得了"+lockA);
            }
        }
    }
}

public class DeadLockDemo {
    public static void main(String[] args) {
        String lockA = "lockA";
        String lockB = "lockB";

        new Thread(new HoldLock(lockA,lockB),"AAA").start();
        new Thread(new HoldLock(lockB,lockA),"BBB").start();
    }
}

解决死锁

windows下的Java运行程序,也有类似于ps 的查看进程的命令,但是目前需要查看的只是java

linux windows下的Java运行程序
ps -ef grep xxxx|jps
ls -l jps -l

idea自带了CMD窗口

idea-cmd

1、通过cmd jps -l查看当前进程编号

2、jstack 15264(进程编号)查看进程异常信息

jstack
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 是什么? 产生死锁的原因:死锁是两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干...
    Groundhog阅读 205评论 0 0
  • 死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推...
    西界__阅读 223评论 0 0
  • 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去...
    名字是乱打的阅读 257评论 0 1
  • 死锁的概念 死锁的定义 在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统的处理能力。然...
    CodeKing2017阅读 1,494评论 0 4
  • 1 什么是死锁? 所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力...
    赵潞desu阅读 1,921评论 0 0