Java并发编程:共享资源引发的问题案例

原创 爱被打了一巴掌 2024-12-04 06:27 137阅读 0赞

在Java并发编程中,共享资源可能会引发一些常见的问题。以下是一些案例:

  1. 竞态条件:当多个线程同时访问和修改共享资源时,就会出现竞态条件。例如:

    1. // 假设count为共享资源
    2. count++;
    3. synchronized(count) { // 加锁防止竞态
    4. if (count % 2 == 1) { // 错误逻辑
    5. System.out.println("奇数不应被加1");
    6. }
    7. count--;
    8. }

    此例中,线程1先读取到count = 1,然后加1。此时,线程2也尝试读取并加1,这就会导致竞态条件。

  2. 死锁:当两个或多个线程在执行过程中因竞争资源而造成的一种状态,即互相等待对方释放已持有的资源,从而无法继续执行。例如:

    1. // 假设两个线程共享一个资源arr
    2. class WorkerThread extends Thread {
    3. private int index;
    4. WorkerThread(int index) {
    5. this.index = index;
    6. }
    7. @Override
    8. public void run() {
    9. synchronized(arr[index])) { // 锁住arr[index]
    10. arr[index] += 1; // 读取并加1
    11. arr[index].notifyAll(); // 唤醒所有等待的线程
    12. } else {
    13. System.out.println("尝试加1时,arr[" + index + "]已被释放");
    14. }
    15. }
    16. }
    17. }
    18. // 创建两个工作线程
    19. WorkerThread thread1 = new WorkerThread(0);
    20. WorkerThread thread2 = new WorkerThread(1);
    21. thread1.start();
    22. thread2.start();

    此例中,线程1和线程2共享一个数组arr。线程1尝试加1到arr[0],而线程2在arr[1]上进行同样的操作。如果线程1先加完1,然后释放锁等待线程2加完1并释放锁,就会导致死锁。

在编写并发程序时,应尽量避免共享资源的直接修改,并使用适当的同步机制来保证多线程环境下的正确执行。

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

发表评论

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

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

相关阅读