Java多线程问题:死锁实例

原创 男娘i 2024-09-11 12:18 233阅读 0赞

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

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

  1. // 创建两个线程A和B
  2. class ThreadA extends Thread {
  3. private Object lock1 = new Object();
  4. private Object lock2 = new Object();
  5. public void run() {
  6. synchronized (lock1) {
  7. try {
  8. System.out.println("Thread A acquire lock1");
  9. // 等待锁2可用
  10. synchronized (lock2) {
  11. System.out.println("Thread A acquire lock2");
  12. // 释放锁1,让线程B获取
  13. lock1.notify();
  14. // 再等待锁2释放,再次获取锁2
  15. lock2.wait();
  16. System.out.println("Thread A release lock2");
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. } finally {
  21. System.out.println("Thread A release lock1");
  22. }
  23. }
  24. }
  25. }
  26. class ThreadB extends Thread {
  27. private Object lock1 = new Object();
  28. private Object lock2 = new Object();
  29. public void run() {
  30. synchronized (lock1) {
  31. try {
  32. System.out.println("Thread B acquire lock1");
  33. // 等待锁2可用
  34. synchronized (lock2) {
  35. System.out.println("Thread B acquire lock2");
  36. // 释放锁1,让线程A获取
  37. lock1.notify();
  38. // 再等待锁2释放,再次获取锁2
  39. lock2.wait();
  40. System.out.println("Thread B release lock2");
  41. } catch (InterruptedException e) {
  42. e.printStackTrace();
  43. }
  44. } finally {
  45. System.out.println("Thread B release lock1");
  46. }
  47. }
  48. }
  49. }
  50. public class Main {
  51. public static void main(String[] args) {
  52. ThreadA threadA = new ThreadA();
  53. ThreadB threadB = new ThreadB();
  54. // 启动线程
  55. threadA.start();
  56. threadB.start();
  57. }
  58. }

在这个例子中,两个线程ThreadAThreadB分别持有锁1和锁2。如果线程A先获取到锁1,然后等待锁2释放,但此时线程B已经获取了锁2并占用。线程A无法释放自己的锁1去获取锁2,因此形成了死锁。

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

发表评论

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

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

相关阅读

    相关 Java线同步问题实例

    死锁是多线程编程中常见的问题,当两个或更多的线程因争夺资源而造成的一种互相等待的现象称为死锁。 下面是一个简单的Java多线程同步死锁问题实例: ```java // 定义

    相关 Java线问题实例

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