并发编程难题:Java多线程锁竞争和死锁案例

原创 我会带着你远行 2024-09-26 08:51 155阅读 0赞

在Java的多线程环境中,锁竞争和死锁是常见的并发问题。下面分别给出这两种情况的例子。

  1. 锁竞争(Race Condition):
    假设有一个共享资源(如变量count),两个线程A和B同时访问这个资源。如果它们的操作没有明确的顺序关系,就可能导致竞态条件。

    例如代码:

    1. class Counter {
    2. int count = 0;
    3. synchronized void increment() {
    4. count++;
    5. }
    6. synchronized int get() {
    7. return count;
    8. }
    9. }

    在这里,线程A和B同时调用increment()方法。如果两个线程操作的顺序不明确,就可能发生锁竞争。

  2. 死锁(Deadlock):
    死锁通常发生在多个线程相互等待对方释放资源的情况下。这种情况下无法推进任何事务,导致系统陷入僵死状态。

    例如代码:

    1. class BankAccount {
    2. int money = 0;
    3. Object lock1, lock2;
    4. synchronized void deposit(int amount) {
    5. lock1.lock();
    6. try {
    7. money += amount;
    8. } finally {
    9. lock1.unlock();
    10. }
    11. lock2.lock();
    12. try {
    13. // 如果账户余额足够,执行转账操作
    14. if (money >= amount) {
    15. money -= amount;
    16. System.out.println("成功转出 " + amount);
    17. } else {
    18. System.out.println("账户余额不足,无法完成转账");
    19. }
    20. } finally {
    21. lock2.unlock();
    22. }
    23. }
    24. synchronized void withdraw(int amount) {
    25. lock1.lock();
    26. try {
    27. // 检查账户余额是否足够
    28. if (money >= amount) {
    29. money -= amount;
    30. System.out.println("成功取出 " + amount);
    31. } else {
    32. System.out.println("账户余额不足,无法完成取款");
    33. }
    34. } finally {
    35. lock1.unlock();
    36. }
    37. }
    38. }

    在这里,两个线程A和B分别调用withdraw()方法和deposit()方法。如果两个线程操作的顺序不明确,就可能出现死锁,因为每个线程都在等待对方释放资源。

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

发表评论

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

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

相关阅读