当前位置:   article > 正文

多线程并发编程-死锁问题和对应的解决方案汇总-面试常考_多线程死锁的原因以及解决方法 面试题

多线程死锁的原因以及解决方法 面试题

一、首先死锁需要满足以下几个条件:

      多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结束。这是从网上其他文档看到的死锁产生的四个必要条件:

  • 1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
  • 2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
  • 3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
  • 4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。下面用java代码来模拟一下死锁的产生。

 

二、解决办法:

       只要打破四个必要条件中的一个,当然互斥不能打破,否则就会带来线程安全性问题,破坏原子性。

       1、死锁“车祸”现场,代码示例: 

  1. package com.jason.thread.deadthread;
  2. import static java.lang.Thread.sleep;
  3. /**
  4. * @program: JasonSpringBoot
  5. * @description
  6. * @author: 大龄程序猿
  7. * @create: 2020-05-23 23:50
  8. **/
  9. public class TestMain {
  10. public static void main(String[] args) {
  11. Thread thread1=new Thread(new Thread1(),"thread1");
  12. Thread thread2=new Thread(new Thread2(),"thread2");
  13. thread1.start();
  14. thread2.start();
  15. }
  16. }
  17. class Thread1 implements Runnable
  18. {
  19. @Override
  20. public void run() {
  21. try {
  22. synchronized (Lock.lock1) {
  23. System.out.println("Thread1 lock resource1");
  24. Thread.sleep(2000);
  25. synchronized (Lock.lock2) {
  26. System.out.println("Thread1 lock resource2");
  27. }
  28. System.out.println("Thread1 release resource2");
  29. }
  30. System.out.println("Thread1 release resource1");
  31. }catch (Exception e)
  32. {
  33. e.printStackTrace();
  34. }
  35. }
  36. }
  37. class Thread2 implements Runnable
  38. {
  39. @Override
  40. public void run() {
  41. try {
  42. synchronized (Lock.lock2) {
  43. System.out.println("Thread2 lock resource2");
  44. Thread.sleep(2000);
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/721067
推荐阅读
相关标签
  

闽ICP备14008679号