C# list线程安全

不安全的例子

cs 复制代码
/// <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循环数量

锁的方式保证安全

cs 复制代码
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);
        }
        //正确的结果应该是70
        System.Console.WriteLine($"main: list size:{mylist.Count}");   
    }
    t.Wait();
}

线程安全的队列

cs 复制代码
/// <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);
        }
        //正确的结果应该是70
        System.Console.WriteLine($"main: list size:{mylist.Count}");   
        t.Wait();
        //取出数据
        //mylist.TryDequeue(out int a);
    }

线程安全的无序列表

cs 复制代码
/// <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);
        }
        //正确的结果应该是70
        System.Console.WriteLine($"main: list size:{mylist.Count}");   
        t.Wait();
        //取出数据
        //mylist.TryTake(out int a);
    }
相关推荐
iCxhust2 小时前
c# U盘映像生成工具
开发语言·单片机·c#
科技云报道3 小时前
2025全球数字经济大会—云智算安全论坛暨第三届“SecGo论坛”成功召开!共筑安全新生态
安全
emplace_back4 小时前
C# 集合表达式和展开运算符 (..) 详解
开发语言·windows·c#
阿蒙Amon5 小时前
为什么 12 版仍封神?《C# 高级编程》:从.NET 5 到实战架构,进阶者绕不开的必修课
开发语言·c#
深海潜水员6 小时前
【Behavior Tree】-- 行为树AI逻辑实现- Unity 游戏引擎实现
游戏·unity·c#
开开心心_Every6 小时前
便捷的Office批量转PDF工具
开发语言·人工智能·r语言·pdf·c#·音视频·symfony
群联云防护小杜6 小时前
构建分布式高防架构实现业务零中断
前端·网络·分布式·tcp/ip·安全·游戏·架构
独行soc7 小时前
2025年渗透测试面试题总结-2025年HW(护网面试) 33(题目+回答)
linux·科技·安全·网络安全·面试·职场和发展·护网
小码编匠8 小时前
C# 上位机开发怎么学?给自动化工程师的建议
后端·c#·.net