多线程下的for循环和foreach循环 System.InvalidOperationException: 集合已修改;可能无法执行枚举

背景:当循环体在循环的时候有需求要修改自己。或者在多线程下,循环静态变量的时候,别人很容易修改了循环体内的数据。但是这就会报错的

准备:for;foeach;多线程。

解决方案:For循环是线程安全的,foreach是线程不安全的。说起开好像很高大上哈。意思是在循环内如,如果调用他们自己的循环体。前者是可以的,但是后者是不行的。

再者如果你循环的是字典。字典是键值对的形式,所以采用线程安全的字典ConcurrentDictionary的字典也可以一定程度的解决问题。但是做好的方案还是添加锁

1,用for

2,用安全集合

3,用锁(最安全但是影响性能)

代码结果展示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ForAndForeach
{
    class Program
    {

        static void Main(string[] args)
        {
            //整型列表
            List<int> listInt = new List<int>();
            listInt.Add(0);
            listInt.Add(1);
            listInt.Add(2);
            listInt.Add(3);
            listInt.Add(4);
            listInt.Add(5);
            //for循环调用自己
            for (int i = 0; i < listInt.Count; i++) {
                Console.WriteLine("for:"+listInt[i]);
                listInt.Add(6);
                if (i == 6)
                {
                    break;
                }
            }
            //foreach循环调用自己
            foreach (int i in listInt) {
                Console.WriteLine("foreach:"+i);
                listInt.Add(7);
                if (i == 7) {
                    break;
                }
            }

        }
    }
}

时间: 2024-11-05 21:51:00

多线程下的for循环和foreach循环 System.InvalidOperationException: 集合已修改;可能无法执行枚举的相关文章

二维数组遍历的方式(for普通循环和foreach循环)

package com.Summer_0421.cn; /** * @author Summer * 二维数组遍历的方式for普通循环和foreach循环 */ public class Test03 { public static void main(String[] args) { show1(); show2(); } private static void show2() { int[][] its = new int[][]{{1},{1,2},{1,2,3},{1,2,3,4}};

使用for循环还是foreach循环?

很多时候我们很自然的认为,for循环的时候使用foreach和原来的for循环用下标的方式遍历是相同的. 而且因为foreach循环写法简单,很容易理解,而且少去了很多麻烦的变量,所以估计在学会使用foreach循环之后,很多人就没有用过下标的循环了. 但是你知道两者其实还是有很大区别的,在不同的情况下面应该使用不同的方式去循环. 否则会导致循环的时间变长.数据量小的时候当然没有什么关系,但是一旦数据量大了之后问题就会暴露出来了. 首先我们要知道的时候foreach循环是利用迭代器的使用循环.那

JavaScript的map循环、forEach循环、filter循环

1.map循环 let arr=[1,2,3,4]; arr.map(function(value,key,arr){ //值,索引,数组(默认为选定数组) return item; //如果没有return则返回一个全是undefined的数组,个数是索引+1(key+1) }) //返回一个数组 2.forEach循环 let arr=[1,2,3,4]; arr.map(function(value,key,arr){ //值,索引,数组(默认为选定数组) return item; //进

PHP的for循环和foreach循环

PHP中的for循环 <?php $arr = array("a", "b", "c"); for( $i = 0; $i < count($arr); $i++){ echo $arr[$i]; }; // count 相当于js中的 length ?> 优化一下 <?php $arr = array("a", "b", "c", 'd'); $num = co

多线程下的集合安全

在多线程内使用集合,如果未对集合做任何安全处理,就非常容易出现系统崩溃或各种错误.最近的项目里,使用的是socket通信后再改变了某个集合,结果导致系统直接崩溃,且无任何错误系统弹出. 经排查,发现问题是执行某集合后,系统就会在一定时间内退出,最后发现是使用的一个字典集合出了问题.稍微思考后,就认定了是线程安全问题.因为此集合在其它几个地方都有线程做循环读取. 下面是我模拟的一个示例,没有进行任何的安全处理: 1 class Program 2 { 3 static MyCollection m

为什么阿里禁止在 foreach 循环里进行元素的 remove/add 操作

在阿里巴巴Java开发手册中,有这样一条规定:但是手册中并没有给出具体原因,本文就来深入分析一下该规定背后的思考.1.foreach循环foreach循环(Foreach loop)是计算机编程语言中的一种控制流程语句,通常用来循环遍历数组或集合中的元素.Java语言从JDK 1.5.0开始引入foreach循环.在遍历数组.集合方面,foreach为开发人员提供了极大的方便.通常也被称之为增强for循环.foreach 语法格式如下: for(元素类型t 元素变量x : 遍历对象obj){ 引

为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作

这个问题我在实际写代码中也遇到过,当时还很疑惑,刚看到这里有一些解释得挺清楚,记录一下: 原文地址为:https://mp.weixin.qq.com/s?__biz=MzI3NzE0NjcwMg==&mid=2650123395&idx=1&sn=b089eac4f561f58ee8a92602db17f577&chksm=f36bb1a2c41c38b4f36c1a84f205e188a6a8aa2684f316e4dcb8d1162b6e94b970c670b2e5b

java容器中遍历循环Iterator 和 Foreach 循环

最近遇到这样一个问题,要删除一个集合中的某个元素,该怎么解决? 我自己写了两段代码来删除,都报了一个错java.util.ConcurrentModificationException:为了让更多可能没注意到这个点的程序猿注意一下,我在这里分享下~ 先看代码 1 package com.zwt1234; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 import java.util.Set; 6 7 public cla

JavaOO视频-08【for、foreach循环应用】

转载请标明,http://www.gxabase.com 视频内容此节视频重点介绍for循环和foreach循环的应用. JavaOO视频-08[for.foreach循环应用],布布扣,bubuko.com