两个线程同时操作一个集合,一个线程读,一个线程写。有可能会产生并发问题吗?

我下面的代码为啥没有并发问题? 请哪位大神指导下

class Program
{
    public Thread Threadone;
    public Thread Threadtwo;
    public event EventHandler EventRun;
    public static object obj=new object();
    ArrayList ListArry = new ArrayList();
    private static void Main(string[] args)
    {
        var p = new Program();
        p.Init();
        Console.ReadKey();
    }

    private void Init()
    {
        Threadone=new Thread(AddArry);
        Threadtwo = new Thread(ReadArry);
        Threadone.Start();
        Threadtwo.Start();
    }
    /// <summary>
    /// 读取数据
    /// </summary>
    private void ReadArry()
    {
        for (int i = 0; i < ListArry.Count; i++)
        {
            lock (ListArry.SyncRoot)
            {
                Console.WriteLine(ListArry[i]);
            }

            Thread.Sleep(100);
        }
        Console.WriteLine("线程{0}读取完成", Thread.CurrentThread.Name);
        EventRun+=Program_EventRun;
    }

    private void Program_EventRun(object sender, EventArgs e)
    {
        Threadtwo.Abort();
    }

    private void Program_EventRun1(object sender, EventArgs e)
    {
        Threadone.Abort();
    }
    /// <summary>
    /// 写入数据
    /// </summary>
    private void AddArry()
    {
        var rand = new Random(1000);
        for (int i = 0; i < 100; i++)
        {

            var num = rand.Next();
            lock (ListArry.SyncRoot)
            {
                ListArry.Add(num);
            }
            Thread.Sleep(100);
        }
        Console.WriteLine("线程{0}写完成。", Thread.CurrentThread.Name);
        EventRun += Program_EventRun1;
    }
}

多线程编程的时候往往用到互斥锁与信号量使得线程同步,如果不按此方法进行安全编程,很有可能使得线程对境界资源访问的时候出现竞态。注意:我们需要达到的是线程同步,需要避免的是竞态。从你的提问中可以看出你对同步的概念并不太理解