
using System;
using System.Collections.Generic;
using System.Threading;
namespace CollSecExp
{
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int>();
for (int i = 0; i < 10; i)
{
list.Add(i);
}
Thread t1 = new Thread(() =>
{
foreach (var item in list)
{
Console.WriteLine("t1.item:{0}", item);
Thread.Sleep(1000);
}
});
t1.Start();
Thread t2 = new Thread(() =>
{
Thread.Sleep(1000);
list.RemoveAt(1);
list.RemoveAt(3);
foreach (var item in list)
{
Console.WriteLine("t2.item:{0}", item);
}
});
t2.Start();
}
}
}
运行示例代码1,会抛出InvalidOperationException异常,提示“集合已修改;可能无法执行枚举操作。”
这是因为,线程2移除index=1,3的元素导致集合被修改,很显然,此时线程1遍历集合肯定会出错,因为它这时遍历得到的结果与实际情况已经不符,就算取出也没有了价。
针对这种情况,我们可以对集合加锁来保证线程对集合操作的同步。
修改示例代码1,得到示例代码2using System;
using System.Collections.Generic;
using System.Threading;
namespace CollSecExp
{
class Program
{
static void Main(string[] args)
{
object sycObj = new object();
List<int> list = new List<int>();
for (int i = 0; i < 10; i)
{
list.Add(i);
}
Thread t1 = new Thread(() =>
{
lock (sycObj)
{
foreach (var item in list)
{
Console.WriteLine("t1.item:{0}", item);
Thread.Sleep(1000);
}
}
});
t1.Start();
Thread t2 = new Thread(() =>
{
Thread.Sleep(1000);
lock (sycObj)
{
list.RemoveAt(1);
list.RemoveAt(3);
foreach (var item in list)
{
Console.WriteLine("t2.item:{0}", item);
}
}
});
t2.Start();
}
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-40268-1.html
2一个不如一个
也不是实心弹
不能多吃