Java多线程之死锁编码及定位分析

系统管理员 2022-04-25 08:46 290阅读 0赞

Java多线程之死锁编码及定位分析


目录

  1. 死锁是什么
  2. 代码实现
  3. 死锁解决办法

1. 死锁是什么

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

在这里插入图片描述

2. 代码实现

  1. 代码实现

    import java.util.concurrent.TimeUnit;

    class HoldLockThread implements Runnable{

  1. private String lockA;
  2. private String lockB;
  3. public HoldLockThread(String lockA, String lockB) {
  4. this.lockA = lockA;
  5. this.lockB = lockB;
  6. }
  7. @Override
  8. public void run() {
  9. synchronized (lockA){
  10. System.out.println(Thread.currentThread().getName()+"\t 自己持有:"+lockA+"\t 尝试持有:"+lockB);
  11. //暂停一会儿线程
  12. try {
  13. TimeUnit.SECONDS.sleep(1);
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17. synchronized (lockB){
  18. System.out.println(Thread.currentThread().getName()+"\t 自己持有:"+lockB+"\t 尝试持有:"+lockA);
  19. }
  20. }
  21. }
  22. }
  23. public class DeadLockDemo {
  24. public static void main(String[] args) {
  25. String lockA = "lockA";
  26. String lockB = "lockB";
  27. new Thread(new HoldLockThread(lockA,lockB),"ThreadAAA").start();
  28. new Thread(new HoldLockThread(lockB,lockA),"ThreadBBB").start();
  29. }
  30. }

3. 死锁解决办法


  1. jps命令定位进程号
    在这里插入图片描述
  2. jstack找到死锁查看

命令: jstack 进程号 显示结果

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,290人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java线案例分析

    在Java多线程编程中,死锁是一种严重的问题。简单来说,死锁就是两个或多个线程相互等待对方释放资源的情况,但这种等待是无限的,所以会导致整个系统无法进行。 下面是一个经典的J

    相关 编码定位分析

    一、死锁 死锁是指两个或两个以上进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们都将无法推进下去。 二、死锁代码案例 packag

    相关 线实例与定位

    既然可以上锁,那么假如有2个线程,一个线程想先锁对象1,再锁对象2,恰好另外有一个线程先锁对象2,再锁对象1。在这个过程中,当线程1把对象1锁好以后,就想去锁对象2,但是不巧,