Java多线程编程中的死锁现象实例

原创 旧城等待, 2024-11-29 16:12 31阅读 0赞

死锁是多线程编程中的一种严重问题,当两个或更多线程因争夺资源而造成的一种相互等待的现象时,就会发生死锁。

以下是一个简单的Java死锁例子:

  1. // 线程1需要资源A和资源B
  2. class Thread1 extends Thread {
  3. private Object resourceA;
  4. private Object resourceB;
  5. public Thread1(Object resourceA, Object resourceB) {
  6. this.resourceA = resourceA;
  7. this.resourceB = resourceB;
  8. }
  9. @Override
  10. public void run() {
  11. synchronized (resourceA) {
  12. synchronized (resourceB) {
  13. System.out.println("Thread 1: Acquiring resources...");
  14. // 这里模拟资源的获取,可能会阻塞
  15. try {
  16. Thread.sleep(2000); // 模拟耗时操作
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. System.out.println("Thread 1: Resources acquired, waiting for resourceB...");
  21. // 这里再次模拟资源的等待,可能会阻塞
  22. try {
  23. Thread.sleep(2000); // 模拟耗时操作
  24. } catch (InterruptedException e) {
  25. e.printStackTrace();
  26. }
  27. System.out.println("Thread 1: ResourceB acquired, acquiring resourceA...");
  28. // 此处可能会导致资源A和资源B的循环等待,即死锁
  29. synchronized (resourceB) {
  30. synchronized (resourceA) {
  31. System.out.println("Thread 1: Resources acquired and released.");
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }
  38. // 线程2需要资源A和资源C
  39. class Thread2 extends Thread {
  40. private Object resourceA;
  41. private Object resourceC;
  42. public Thread2(Object resourceA, Object resourceC) {
  43. this.resourceA = resourceA;
  44. this.resourceC = resourceC;
  45. }
  46. @Override
  47. public void run() {
  48. synchronized (resourceA) {
  49. synchronized (resourceC) {
  50. System.out.println("Thread 2: Acquiring resources...");
  51. // 这里模拟资源的获取,可能会阻塞
  52. try {
  53. Thread.sleep(2000); // 模拟耗时操作
  54. } catch (InterruptedException e) {
  55. e.printStackTrace();
  56. }
  57. System.out.println("Thread 2: Resources acquired, waiting for resourceC...");
  58. // 这里再次模拟资源的等待,可能会阻塞
  59. try {
  60. Thread.sleep(2000); // 模拟耗时操作
  61. } catch (InterruptedException e) {
  62. e.printStackTrace();
  63. }
  64. System.out.println("Thread 2: ResourceC acquired, acquiring resourceA...");
  65. // 此处可能会导致资源A和资源C的循环等待,即死锁
  66. synchronized (resourceC) {
  67. synchronized (resourceA) {
  68. System.out.println("Thread 2: Resources acquired and released.");
  69. }
  70. }
  71. }
  72. }
  73. }
  74. }
  75. // 启动线程
  76. Thread1 thread1 = new Thread1(new Object(), new Object()));
  77. thread1.start();
  78. Thread2 thread2 = new Thread2(new Object(), new Object()));
  79. thread2.start();

在这个例子中,线程1需要资源A和资源B,线程2需要资源A和资源C。两个线程都互斥地访问各自所需的资源。如果两个线程按照这种方式交替获取资源,可能会导致死锁现象。

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

发表评论

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

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

相关阅读

    相关 Java线编程现象

    在Java的多线程编程中,死锁是一种严重的问题。简单来说,死锁是指两个或多个线程互相等待对方释放资源,而这种状态无法进行下去的一种僵局。 例如,有两个线程T1和T2,它们分别