您的位置:首页 > 科技 > 能源 > C# list线程安全

C# list线程安全

2024/12/23 6:51:58 来源:https://blog.csdn.net/qq_36437991/article/details/139529325  浏览:    关键词:C# list线程安全

不安全的例子

/// <summary>
/// 不安全的例子
/// </summary>
static void unSalfe()
{List<int> mylist = new List<int>();var t = Task.Run(()=>{Thread.Sleep(2000);for(int i=0; i<20; i++){mylist.Add(3);Thread.Sleep(1);}System.Console.WriteLine($"task: list size:{mylist.Count}");});Thread.Sleep(2000);for(int i=0; i<50; i++){Thread.Sleep(1);mylist.Add(6);}//正确的结果应该是70,结果有可能正确也有可能不正确,多运行几次就能看到效果System.Console.WriteLine($"main: list size:{mylist.Count}");     t.Wait();
}

测试不出来可以注释 Thread.Sleep(2000);或者增加for循环数量
在这里插入图片描述

锁的方式保证安全

static void salfe()
{List<int> mylist = new List<int>();var t = Task.Run(()=>{Thread.Sleep(2000);lock((mylist as ICollection).SyncRoot){for(int i=0; i<20; i++){mylist.Add(3);Thread.Sleep(1);}System.Console.WriteLine($"task: list size:{mylist.Count}");}});Thread.Sleep(2000);lock((mylist as ICollection).SyncRoot){for(int i=0; i<50; i++){Thread.Sleep(1);mylist.Add(6);}//正确的结果应该是70System.Console.WriteLine($"main: list size:{mylist.Count}");   }t.Wait();
}

线程安全的队列

/// <summary>/// 安全的队列/// </summary>static void salfeQueue(){var mylist = new ConcurrentQueue<int>();var t = Task.Run(()=>{Thread.Sleep(2000);for(int i=0; i<20; i++){mylist.Enqueue(3);Thread.Sleep(1);}System.Console.WriteLine($"task: list size:{mylist.Count}");});Thread.Sleep(2000);for(int i=0; i<50; i++){Thread.Sleep(1);mylist.Enqueue(6);}//正确的结果应该是70System.Console.WriteLine($"main: list size:{mylist.Count}");   t.Wait();//取出数据//mylist.TryDequeue(out int a);}

线程安全的无序列表

/// <summary>/// 安全的无序数据/// </summary>static void salfeBag(){var mylist = new ConcurrentBag<int>();var t = Task.Run(()=>{Thread.Sleep(2000);for(int i=0; i<20; i++){mylist.Add(3);Thread.Sleep(1);}System.Console.WriteLine($"task: list size:{mylist.Count}");});Thread.Sleep(2000);for(int i=0; i<50; i++){Thread.Sleep(1);mylist.Add(6);}//正确的结果应该是70System.Console.WriteLine($"main: list size:{mylist.Count}");   t.Wait();//取出数据//mylist.TryTake(out int a);}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com