Java多线程并发问题:锁和死锁示例

原创 电玩女神 2024-12-01 02:09 15阅读 0赞

在Java多线程编程中,锁是一种同步机制,用于控制对共享资源的访问。如果管理不当,可能会导致死锁。

1. 锁的理解

  • synchronized关键字:这是Java中最常用的锁,用于修饰方法或代码块。

  • 示例:

    1. public class Counter {
    2. private int count;
    3. public synchronized void increment() {
    4. count++;
    5. }
    6. public synchronized int value() {
    7. return count;
    8. }
    9. }
  • 访问控制:锁定一个资源后,后续线程需要获得相同锁才能访问该资源。

2. 死锁示例

  • 两个线程互相等待对方释放的锁,从而导致无法继续执行。

  • 示例:

    1. public class DeadlockExample {
    2. private Object lock1 = new Object();
    3. private Object lock2 = new Object();
    4. // 线程A和B分别对锁1和锁2进行操作
    5. public void threadA() throws InterruptedException {
    6. synchronized (lock1) {
    7. System.out.println("Thread A acquires lock 1");
    8. // 等待锁2被释放
    9. synchronized (lock2) {
    10. System.out.println("Thread A waits for lock 2");
    11. // 死锁,线程A无法继续执行
    12. }
    13. }
    14. }
    15. public void threadB() throws InterruptedException {
    16. synchronized (lock2) {
    17. System.out.println("Thread B acquires lock 2");
    18. // 等待锁1被释放
    19. synchronized (lock1) {
    20. System.out.println("Thread B waits for lock 1");
    21. // 死锁,线程B无法继续执行
    22. }
    23. }
    24. }
    25. public static void main(String[] args) throws InterruptedException {
    26. DeadlockExample example = new DeadlockExample();
    27. Thread threadA = new Thread(example::threadA));
    28. Thread threadB = new Thread(example::threadB));
    29. threadA.start();
    30. threadB.start();
    31. // 等待所有线程执行完毕
    32. threadA.join();
    33. threadB.join();
    34. System.out.println("Execution completed");
    35. }
    36. }

这个例子中,线程A先获取锁1,然后等待锁2被释放。同时,线程B的逻辑与之相反。

由于锁是相互独立的,所以在没有其他线程尝试同时获取锁1和锁2的情况下,这种情况下会形成死锁。

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

发表评论

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

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

相关阅读