理解和解决Java并发编程中的死锁问题实例

原创 亦凉 2024-09-27 18:45 137阅读 0赞

死锁是Java并发编程中的一种严重问题,当两个或更多的线程互相等待对方释放资源时,就会发生死锁。

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

  1. // 创建两个互有依赖的类
  2. class BankAccount {
  3. int amount;
  4. BankAccount(int amount) { this.amount = amount; }
  5. void withdraw(int amount) { if (amount > this.amount)) throw new IllegalArgumentException("Insufficient funds"); this.amount -= amount; }
  6. }
  7. class LoanApplication {
  8. BankAccount account;
  9. double loanAmount;
  10. LoanApplication(BankAccount account, double loanAmount) {
  11. this.account = account;
  12. this.loanAmount = loanAmount;
  13. }
  14. void applyForLoan() {
  15. withdraw(loanAmount);
  16. }
  17. }
  18. public class Main {
  19. public static void main(String[] args) {
  20. BankAccount bankAccount1 = new BankAccount(50);
  21. BankAccount bankAccount2 = new BankAccount(100);
  22. LoanApplication loanApplication1 = new LoanApplication(bankAccount1, 20));
  23. LoanApplication loanApplication2 = new LoanApplication(bankAccount2, 30));
  24. // 线程开始请求资源
  25. Thread thread1 = new Thread(loanApplication1::applyForLoan));
  26. Thread thread2 = new Thread(loanApplication2::applyForLoan));
  27. // 同时开始线程,可能会导致死锁
  28. thread1.start();
  29. thread2.start();
  30. try {
  31. thread1.join();
  32. thread2.join();
  33. } catch (InterruptedException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }

在这个例子中,两个类(BankAccount和LoanApplication)互相依赖,形成一个资源链。两个线程分别申请了这条链的一部分资源。

如果这两个线程的执行顺序是:先请求loanApplication2::applyForLoan,然后请求loanApplication1::applyForLoan;并且两个请求都需要对方释放资源,那么就会发生死锁。

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

发表评论

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

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

相关阅读