C# Readonly List 线程同步

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)

Eri*_* J. 6

有多个线程从同一个实例读取数据被认为是线程安全的List<T>仅当没有写入者时,

\n
\n

线程安全

\n

此类型的公共静态(在 Visual Basic 中为共享)成员是线程安全的。不保证任何实例成员都是线程安全的。

\n

对列表执行多个读取操作是安全的,但如果在读取集合时修改集合,则可能会出现问题。为了确保线程安全,请在读取或写入操作期间锁定集合。要使集合能够被多个线程访问以进行读写,您必须实现自己的同步。对于具有内置同步功能的集合,请参阅 System.Collections.Concurrent 命名空间中的类。对于本质上线程\xe2\x80\x93安全的替代方案,请参阅 ImmutableList 类。

\n
\n

重点是我的。

\n

http://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx

\n