问题描述
- 两个线程同时操作一个集合,一个线程读,一个线程写。有可能会产生并发问题吗?
-
我下面的代码为啥没有并发问题? 请哪位大神指导下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; } }
解决方案
多线程编程的时候往往用到互斥锁与信号量使得线程同步,如果不按此方法进行安全编程,很有可能使得线程对境界资源访问的时候出现竞态。注意:我们需要达到的是线程同步,需要避免的是竞态。从你的提问中可以看出你对同步的概念并不太理解
时间: 2024-08-12 19:13:47