• 【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 + 进程号 查看栈信息

     

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

     

  • 相关阅读:
    项目
    关于我
    【转载】罗胖精选|什么样的自控方法才有效?
    知识管理——得到CEO脱不花女士的一次分享
    注意由双大括号匿名类引起的serialVersionUID编译告警
    持续集成、持续交付和持续部署
    Google Cayley图数据库使用方法
    任务的属性
    团队博客地址
    个人总结
  • 原文地址:https://www.cnblogs.com/xdcat/p/12983130.html
Copyright © 2020-2023  润新知