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

     

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

     

  • 相关阅读:
    2009年度最佳jQuery插件
    转:Jeff Dean的Stanford演讲
    Zookeeper的RPC框架
    转:电商推荐技术
    NoSQL设计思想(从辅到主)
    工作一年小结
    转:MySQL索引背后的数据结构
    java多线程并发,java的几种状态
    转发:Linux Socket编程
    几个linux shell的讲解网站
  • 原文地址:https://www.cnblogs.com/xdcat/p/12983130.html
Copyright © 2011-2022 走看看