Java多线程问题:死锁现象实例

原创 深藏阁楼爱情的钟 2024-09-17 21:51 179阅读 0赞

死锁是一种在多线程环境下可能出现的严重问题。当两个或更多线程因争夺资源而造成的一种互相等待的现象时,就可能导致死锁。

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

  1. // 定义一个共享资源,比如银行账户
  2. class BankAccount {
  3. private int balance = 0;
  4. // 获取账户余额
  5. public int getBalance() {
  6. return balance;
  7. }
  8. // 存款
  9. public void deposit(int amount) {
  10. if (amount > 0) {
  11. balance += amount;
  12. }
  13. }
  14. // 取款
  15. public void withdraw(int amount) {
  16. if (amount > 0 && balance >= amount) {
  17. balance -= amount;
  18. } else {
  19. System.out.println("Insufficient balance");
  20. }
  21. }
  22. }
  23. // 创建两个线程,每个线程都有一个银行账户
  24. public class DeadLockExample {
  25. private BankAccount account1 = new BankAccount();
  26. private BankAccount account2 = new BankAccount();
  27. // 线程1:存款后取款
  28. public void thread1() {
  29. account1.deposit(50); // 存款
  30. account1.withdraw(30); // 取款
  31. System.out.println("Thread 1 completed");
  32. }
  33. // 线程2:取款后存款
  34. public void thread2() {
  35. account2.withdraw(40); // 取款
  36. account2.deposit(60); // 存款
  37. System.out.println("Thread 2 completed");
  38. }
  39. public static void main(String[] args) {
  40. DeadLockExample example = new DeadLockExample();
  41. Thread thread1 = new Thread(example::thread1));
  42. Thread thread2 = new Thread(example::thread2));
  43. thread1.start(); // 开始线程1
  44. thread2.start(); // 开始线程2
  45. try {
  46. thread1.join(); // 等待线程1完成
  47. thread2.join(); // 等待线程2完成
  48. } catch (InterruptedException e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. }

在这个例子中,线程1先存款50,然后取款30。在这期间,线程2尝试从账户2取款40。

由于账户2的余额不足以支持这两次操作(取款后必须有足够余额进行存款),所以线程2会一直等待,形成死锁现象。

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

发表评论

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

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

相关阅读

    相关 Java线问题实例

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