理解Java集合框架:并发修改问题案例
在Java的集合框架中,尤其是多线程环境下,可能会遇到并发修改的问题。以下是一个具体的案例:
import java.util.ArrayList;
import java.util.List;
public class ConcurrentModify {
private List<String> list = new ArrayList<>();
public void add(String item) {
// 多线程环境,多个add方法同时执行
synchronized (list) {
list.add(item);
}
}
public List<String> getList() {
return list;
}
public static void main(String[] args) {
ConcurrentModify collection = new ConcurrentModify();
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
collection.add("Item " + i);
try {
Thread.sleep(50); // 模拟延迟
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}));
Thread thread2 = new Thread(() -> {
for (int i = 10; i < 20; i++) {
collection.add("Item " + i);
try {
Thread.sleep(50); // 模拟延迟
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}));
thread1.start();
thread2.start();
// 注意,这里可能会获取到未完全添加的元素
System.out.println(collection.getList());
}
}
在这个案例中,我们创建了一个ConcurrentModify
类,它有一个list
列表用于存放元素。我们有两个线程分别向列表添加元素。
问题在于,由于并发修改,当我们尝试打印完整列表时,可能会获取到未完全添加的元素。
要解决这个问题,通常我们会使用synchronized
关键字来确保同一时间只有一个线程在访问列表。或者,也可以考虑使用原子变量
或ReentrantLock
等并发工具来管理并发访问。
还没有评论,来说两句吧...