Jus*_*hew 2 c# multithreading synchronization thread-safety
我在这里所做的是通过 for-each 和索引方法在多个线程中导航只读列表。结果看起来线程安全,但我不相信。
有人可以告诉下面的代码(从只读列表中读取)是否是线程安全的吗?如果是的话为什么?
public class ThreadTest
{
readonly List<string> port;
public ThreadTest()
{
port = new List<string>() { "1", "2", "3", "4", "5", "6" };
}
private void Print()
{
foreach (var itm in port)
{
Thread.Sleep(50);
Console.WriteLine(itm+"----"+Thread.CurrentThread.ManagedThreadId);
}
}
private void Printi()
{
for(int i=0;i<5;i++)
{
Thread.Sleep(100);
Console.WriteLine(port[i] + "--iiiii--" + Thread.CurrentThread.ManagedThreadId);
}
}
public void StartThread()
{
Task[] tsks = new Task[10];
tsks[0] = new Task(Print);
tsks[1] = new Task(Print);
tsks[2] = new Task(Print);
tsks[3] = new Task(Print);
tsks[4] = new Task(Print);
tsks[5] = new Task(Printi);
tsks[6] = new Task(Printi);
tsks[7] = new Task(Printi);
tsks[8] = new Task(Printi);
tsks[9] = new Task(Printi);
foreach (var tsk in tsks)
{
tsk.Start();
}
Task.WaitAll(tsks);
}
}
class Program
{
static void Main(string[] args)
{
new ThreadTest().StartThread();
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
有多个线程从同一个实例读取数据被认为是线程安全的List<T>仅当没有写入者时,
\n\n线程安全
\n此类型的公共静态(在 Visual Basic 中为共享)成员是线程安全的。不保证任何实例成员都是线程安全的。
\n对列表执行多个读取操作是安全的,但如果在读取集合时修改集合,则可能会出现问题。为了确保线程安全,请在读取或写入操作期间锁定集合。要使集合能够被多个线程访问以进行读写,您必须实现自己的同步。对于具有内置同步功能的集合,请参阅 System.Collections.Concurrent 命名空间中的类。对于本质上线程\xe2\x80\x93安全的替代方案,请参阅 ImmutableList 类。
\n
重点是我的。
\nhttp://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx
\n