Java多线程编程:死锁、资源争抢等问题实例

原创 客官°小女子只卖身不卖艺 2024-11-26 20:57 91阅读 0赞

在Java多线程编程中,死锁、资源争抢等问题可能会发生。下面我们将通过一些实例来解释这些问题。

  1. 死锁
    死锁通常发生在两个或多个线程互相等待对方释放资源的情况。例如:
  1. class BankAccount {
  2. int balance;
  3. }
  4. class ThreadA extends Thread {
  5. private BankAccount account;
  6. ThreadA(BankAccount account) {
  7. this.account = account;
  8. }
  9. @Override
  10. public void run() {
  11. // 模拟线程对银行账户的资源争抢
  12. while (account.balance < 10) {
  13. try {
  14. // 等待线程B释放资源
  15. account.balance += 5;
  16. System.out.println("Thread A: 获取到资源");
  17. break;
  18. } catch (InterruptedException e) {
  19. e.printStackTrace();
  20. Thread.currentThread().interrupt();
  21. }
  22. }
  23. // 此时A已获取到资源,可以继续执行任务
  24. }
  25. }
  26. class ThreadB extends Thread {
  27. private BankAccount account;
  28. ThreadB(BankAccount account) {
  29. this.account = account;
  30. }
  31. @Override
  32. public void run() {
  33. // 模拟线程对银行账户的资源争抢
  34. while (account.balance < 5) {
  35. try {
  36. // 等待线程A释放资源
  37. account.balance += 2;
  38. System.out.println("Thread B: 获取到资源");
  39. break;
  40. } catch (InterruptedException e) {
  41. e.printStackTrace();
  42. Thread.currentThread().interrupt();
  43. }
  44. }
  45. // 此时B已获取到资源,可以继续执行任务
  46. }
  47. }
  48. public class Main {
  49. public static void main(String[] args) {
  50. BankAccount account = new BankAccount();
  51. // 创建线程A和线程B,模拟资源争抢
  52. ThreadA threadA = new ThreadA(account);
  53. ThreadB threadB = new ThreadB(account);
  54. // 启动两个线程
  55. threadA.start();
  56. threadB.start();
  57. }
  58. }

当这个程序运行时,线程A和线程B同时开始,各自模拟资源争抢。由于account.balance < 10的条件,线程A最终会获取到账户中的5个单位的资源。此时线程A可以继续执行任务。

然而,如果线程B在此之前已经获取了2个单位的资源,那么它们就可能会陷入死锁状态,因为它们都在等待对方释放资源。为了避免这种情况,通常需要在设计多线程程序时考虑到互斥和同步机制。

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

发表评论

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

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

相关阅读