Java多线程理解:死锁问题实例

原创 向右看齐 2024-10-25 09:24 140阅读 0赞

死锁是多线程编程中的一种严重问题,它发生在两个或更多线程相互等待对方释放资源,从而形成的一种僵局。

以下是一个简单的Java多线程死锁问题实例:

  1. // 线程1需要资源A和B
  2. public class ResourceA {
  3. private Object resource = new Object();
  4. public synchronized void acquire() throws InterruptedException {
  5. while (resource != null) {
  6. await();
  7. }
  8. resource = new Object(); // 资源被占用
  9. }
  10. public synchronized void release() {
  11. resource = null; // 资源被释放
  12. notifyAll(); // 通知等待的线程
  13. }
  14. }
  15. public class ResourceB {
  16. private Object resource = new Object();
  17. public synchronized void acquire() throws InterruptedException {
  18. while (resource != null) {
  19. await();
  20. }
  21. resource = new Object(); // 资源被占用
  22. }
  23. public synchronized void release() {
  24. resource = null; // 资源被释放
  25. notifyAll(); // 通知等待的线程
  26. }
  27. }
  28. public class DeadlockExample implements Runnable {
  29. private ResourceA resourceA;
  30. private ResourceB resourceB;
  31. public DeadlockExample(ResourceA resourceA, ResourceB resourceB) {
  32. this.resourceA = resourceA;
  33. this.resourceB = resourceB;
  34. }
  35. @Override
  36. public void run() {
  37. try {
  38. // 线程1获取资源A
  39. resourceA.acquire();
  40. // 线程2获取资源B
  41. resourceB.acquire();
  42. // 死锁形成,两个线程无法同时执行
  43. System.out.println("Deadlock detected");
  44. } catch (InterruptedException e) {
  45. e.printStackTrace();
  46. } finally {
  47. // 释放资源
  48. resourceA.release();
  49. resourceB.release();
  50. }
  51. }
  52. }
  53. public class Main {
  54. public static void main(String[] args) {
  55. ResourceA resourceA = new ResourceA();
  56. ResourceB resourceB = new ResourceB();
  57. Thread thread1 = new Thread(new DeadlockExample(resourceA, resourceB)), "Thread 1");
  58. Thread thread2 = new Thread(new DeadlockExample(resourceA, resourceB))), "Thread 2");
  59. thread1.start();
  60. thread2.start();
  61. }
  62. }

在这个例子中,线程1需要资源A和B(分别对应ResourceA和ResourceB),而线程2同样需要这两个资源。由于两个线程都持有某个资源,它们都无法释放自己的资源去获取另一个资源,从而形成了死锁。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

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

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

相关阅读

    相关 Java线问题实例

    死锁是多线程编程中的一种严重问题。当两个或更多的线程因争夺资源而造成的一种互相等待的现象时,就会出现死锁。 以下是一个简单的Java死锁实例: ```java // 创建两