Java集合框架中的并发问题案例分析

原创 阳光穿透心脏的1/2处 2024-10-25 13:00 100阅读 0赞

在Java集合框架中,由于并发操作的存在,可能会导致数据一致性、线程安全等问题。以下是一个常见的并发问题案例分析:

  1. 案例:多个线程同时修改一个共享的ArrayList。
  1. import java.util.ArrayList;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. public class SharedArrayListCase {
  5. private ArrayList<Integer> sharedList = new ArrayList<>();
  6. public void addThread(int threadNum) {
  7. ExecutorService executor = Executors.newFixedThreadPool(10);
  8. executor.submit(() -> {
  9. for (int i = 0; i < 500; i++) {
  10. // 修改共享ArrayList
  11. sharedList.add(threadNum * i); // 错误操作,将每个线程的id加入到list中
  12. if (i % 100 == 0) {
  13. System.out.println("Thread " + threadNum + " - Current index: " + i);
  14. }
  15. }
  16. }));
  17. }
  18. public void printSharedList() {
  19. for (int i : sharedList) {
  20. System.out.print(i + " ");
  21. }
  22. System.out.println();
  23. }
  24. public static void main(String[] args) {
  25. SharedArrayListCase case = new SharedArrayListCase();
  26. case.addThread(1);
  27. case.addThread(2);
  28. case.printSharedList(); // 输出错误的结果
  29. }
  30. }
  1. 分析:在上述案例中,多个线程同时修改sharedList。由于并发问题,每个线程在执行过程中都可能对列表进行多次操作。

  2. 错误结果分析:当线程1和线程2同时修改sharedList时,可能会出现以下错误结果:

  1. Thread 1 - Current index: 500
  2. Thread 2 - Current index: 500
  3. Thread 1 - Current index: 499
  4. Thread 2 - Current index: 499
  5. ...
  6. Thread 1 - Current index: 500
  7. Thread 2 - Current index: 500

可以看到,线程1和线程2在修改列表时产生了交叉操作,导致最终输出的结果不正确。

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

发表评论

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

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

相关阅读