zoukankan      html  css  js  c++  java
  • 【JUC】死锁的实现及其定位分析

    死锁的概念

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

     实现死锁

     1 class HoldLockThread implements Runnable{
     2 
     3     private String lockA;
     4     private String lockB;
     5 
     6     public HoldLockThread(String lockA, String lockB) {
     7         this.lockA = lockA;
     8         this.lockB = lockB;
     9     }
    10 
    11     @Override
    12     public void run() {
    13         synchronized (lockA){
    14             System.out.println(Thread.currentThread().getName()+"持有"+lockA+",尝试获得"+lockB);
    15             try {
    16                 TimeUnit.SECONDS.sleep(2);
    17             } catch (InterruptedException e) {
    18                 e.printStackTrace();
    19             }
    20             synchronized (lockB){
    21                 System.out.println(Thread.currentThread().getName()+"持有"+lockB+",尝试获得"+lockA);
    22             }
    23         }
    24 
    25     }
    26 }
    27 public class DeadLockDemo {
    28     public static void main(String[] args) {
    29         String lockA = "lockA";
    30         String lockB = "lockB";
    31         new Thread(
    32             new HoldLockThread(lockA,lockB),"张三"
    33         ).start();
    34         new Thread(
    35             new HoldLockThread(lockB,lockA),"李四"
    36         ).start();
    37     }
    38 }

    如何排查死锁?

    linux: ps -ef|grep xxx

    windows:类似ps的查看进程的命令

    jps可以用来排查java程序的进程,定位到进程号

    jstack + 进程号 查看栈信息

     

    栈信息的总结:两个线程导致的死锁

     

  • 相关阅读:
    class(类)和构造函数(原型对象)
    es6中export和export default的区别
    vue混入 (mixin)的使用
    ES6(Module模块化)
    vue-cli3构建和发布 实现分环境打包步骤(给不同的环境配置相对应的打包命令)
    Vue中使用Echarts 脱坑
    Nginx配置详解
    VUE面包屑组件
    更改 pip 默认下载源(pip 配置文件)
    常见免费API接口
  • 原文地址:https://www.cnblogs.com/xdcat/p/12983130.html
Copyright © 2011-2022 走看看