Java多线程同步问题:死锁案例分析

原创 布满荆棘的人生 2024-11-27 07:15 139阅读 0赞

死锁是多线程编程中的一种严重问题。当两个或更多的线程在执行过程中,因争夺资源而造成的一种互相等待的现象称为死锁。

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

  1. // 线程1
  2. class Thread1 extends Thread {
  3. private Object lock1 = new Object();
  4. private Object lock2 = new Object();
  5. public void run() {
  6. synchronized(lock1) {
  7. System.out.println("Thread 1: Acquire lock 1");
  8. try {
  9. // 等待锁2,模拟资源争夺
  10. synchronized(lock2) {
  11. System.out.println("Thread 1: Wait for lock 2");
  12. }
  13. } catch (InterruptedException e) {
  14. Thread.currentThread().interrupt();
  15. System.out.println("Thread 1: Interrupted while waiting for lock 2");
  16. }
  17. System.out.println("Thread 1: Release lock 1");
  18. }
  19. // 等待锁1释放,模拟资源争夺
  20. synchronized(lock1) {
  21. System.out.println("Thread 1: Wait for lock 1 to release");
  22. }
  23. }
  24. }
  25. // 线程2
  26. class Thread2 extends Thread {
  27. private Object lock1 = new Object();
  28. private Object lock2 = new Object();
  29. public void run() {
  30. synchronized(lock1) {
  31. System.out.println("Thread 2: Acquire lock 1");
  32. try {
  33. // 等待锁2释放,模拟资源争夺
  34. synchronized(lock2) {
  35. System.out.println("Thread 2: Wait for lock 2 to release");
  36. }
  37. } catch (InterruptedException e) {
  38. Thread.currentThread().interrupt();
  39. System.out.println("Thread 2: Interrupted while waiting for lock 2 to release");
  40. }
  41. System.out.println("Thread 2: Release lock 1");
  42. }
  43. // 等待锁1释放,模拟资源争夺
  44. synchronized(lock1) {
  45. System.out.println("Thread 2: Wait for lock 1 to release");
  46. }
  47. }
  48. }
  49. public class Main {
  50. public static void main(String[] args) {
  51. Thread1 thread1 = new Thread1();
  52. Thread2 thread2 = new Thread2();
  53. thread1.start();
  54. thread2.start();
  55. }
  56. }

在这个案例中,线程1首先获取到锁1,然后等待锁2释放。与此同时,线程2也是先获取锁1,然后等待锁1释放。

如果线程2在等待锁1释放期间被中断(例如,操作系统认为线程不应该继续运行),那么线程2将无法获取到锁1,从而导致死锁。

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

发表评论

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

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

相关阅读

    相关 Java线同步问题——案例

    在Java多线程编程中,死锁是一种常见的并发问题。下面是一个简单的死锁案例: 假设我们有两个线程A和B,它们都需要两个资源:资源1(由线程B持有)和资源2(由线程A持有)。

    相关 Java线同步问题案例

    死锁是多线程编程中的一种严重问题,当两个或更多的线程在执行过程中因争夺资源而造成的一种互相等待的现象叫做死锁。 下面是一个经典的死锁案例: 场景:有两个部门A和B,每个部门