Java集合框架中的并发问题案例分析
在Java集合框架中,由于并发操作的存在,可能会导致数据一致性、线程安全等问题。以下是一个常见的并发问题案例分析:
- 案例:多个线程同时修改一个共享的ArrayList。
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SharedArrayListCase {
private ArrayList<Integer> sharedList = new ArrayList<>();
public void addThread(int threadNum) {
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.submit(() -> {
for (int i = 0; i < 500; i++) {
// 修改共享ArrayList
sharedList.add(threadNum * i); // 错误操作,将每个线程的id加入到list中
if (i % 100 == 0) {
System.out.println("Thread " + threadNum + " - Current index: " + i);
}
}
}));
}
public void printSharedList() {
for (int i : sharedList) {
System.out.print(i + " ");
}
System.out.println();
}
public static void main(String[] args) {
SharedArrayListCase case = new SharedArrayListCase();
case.addThread(1);
case.addThread(2);
case.printSharedList(); // 输出错误的结果
}
}
分析:在上述案例中,多个线程同时修改
sharedList
。由于并发问题,每个线程在执行过程中都可能对列表进行多次操作。错误结果分析:当线程1和线程2同时修改
sharedList
时,可能会出现以下错误结果:
Thread 1 - Current index: 500
Thread 2 - Current index: 500
Thread 1 - Current index: 499
Thread 2 - Current index: 499
...
Thread 1 - Current index: 500
Thread 2 - Current index: 500
可以看到,线程1和线程2在修改列表时产生了交叉操作,导致最终输出的结果不正确。
还没有评论,来说两句吧...