理解Java集合框架:并发修改问题案例

原创 今天药忘吃喽~ 2024-12-06 08:24 68阅读 0赞

在Java的集合框架中,尤其是多线程环境下,可能会遇到并发修改的问题。以下是一个具体的案例:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class ConcurrentModify {
  4. private List<String> list = new ArrayList<>();
  5. public void add(String item) {
  6. // 多线程环境,多个add方法同时执行
  7. synchronized (list) {
  8. list.add(item);
  9. }
  10. }
  11. public List<String> getList() {
  12. return list;
  13. }
  14. public static void main(String[] args) {
  15. ConcurrentModify collection = new ConcurrentModify();
  16. Thread thread1 = new Thread(() -> {
  17. for (int i = 0; i < 10; i++) {
  18. collection.add("Item " + i);
  19. try {
  20. Thread.sleep(50); // 模拟延迟
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }));
  26. Thread thread2 = new Thread(() -> {
  27. for (int i = 10; i < 20; i++) {
  28. collection.add("Item " + i);
  29. try {
  30. Thread.sleep(50); // 模拟延迟
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. }));
  36. thread1.start();
  37. thread2.start();
  38. // 注意,这里可能会获取到未完全添加的元素
  39. System.out.println(collection.getList());
  40. }
  41. }

在这个案例中,我们创建了一个ConcurrentModify类,它有一个list列表用于存放元素。我们有两个线程分别向列表添加元素。

问题在于,由于并发修改,当我们尝试打印完整列表时,可能会获取到未完全添加的元素。

要解决这个问题,通常我们会使用synchronized关键字来确保同一时间只有一个线程在访问列表。或者,也可以考虑使用原子变量ReentrantLock等并发工具来管理并发访问。

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

发表评论

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

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

相关阅读