Java多线程编程:死锁和活锁示例

原创 超、凢脫俗 2024-10-19 16:51 134阅读 0赞

在Java多线程编程中,死锁和活锁是两种常见的线程同步问题。

  1. 死锁
    • 死锁是指两个或多个线程在执行过程中因争夺资源而造成的一种互相等待的现象。
    • 常见条件包括:占有并等待;存在循环等待(环形资源分配)。

示例代码(简化版):

  1. class Bank {
  2. int account1, account2;
  3. void deposit(int amount) {
  4. if (amount > 0) {
  5. synchronized (this) { // 使用同步块
  6. if (account1 < amount) {
  7. account1 = amount;
  8. System.out.println("Account 1: " + account1);
  9. } else if (account2 < amount) {
  10. account2 = amount;
  11. System.out.println("Account 2: " + account2);
  12. }
  13. }
  14. }
  15. }
  16. }
  17. public class Main {
  18. public static void main(String[] args) {
  19. Bank bank = new Bank();
  20. // 创建两个线程,分别进行存款操作
  21. Thread thread1 = new Thread(() -> {
  22. for (int i = 0; i < 50; i++) {
  23. bank.deposit(10); // 每次尝试存款10单位
  24. if (i == 24) { // 当前循环到第24步时,尝试进行存款操作的逻辑中断
  25. break;
  26. }
  27. }
  28. }));
  29. Thread thread2 = new Thread(() -> {
  30. for (int i = 0; i < 50; i++) {
  31. bank.deposit(20); // 每次尝试存款20单位
  32. if (i == 39) { // 当前循环到第39步时,尝试进行存款操作的逻辑中断
  33. break;
  34. }
  35. }
  36. }));
  37. thread1.start();
  38. thread2.start();
  39. try {
  40. thread1.join();
  41. thread2.join();
  42. } catch (InterruptedException e) {
  43. e.printStackTrace();
  44. }
  45. // 输出最终账户余额
  46. System.out.println("Final Account Balances:");
  47. System.out.println("Account 1: " + bank.account1);
  48. System.out.println("Account 2: " + bank.account2);
  49. }
  50. }

在这个示例中,两个线程(thread1和thread2)分别进行存款操作。但是,在循环过程中,如果账户余额不足以进行存款,程序会陷入无限等待。

通过这个例子,可以理解死锁的形成条件以及如何避免它。同时,活锁现象没有在这里直接展示,但可以通过调整循环逻辑来实现。

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

发表评论

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

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

相关阅读