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);
    }
相关推荐
网络安全创新研究院3 小时前
飞网揭秘:个人网络与团队网络功能对比
安全
忒可君4 小时前
C# winform FTP功能
开发语言·windows·c#
Warren985 小时前
软件测试-Selenium学习笔记
java·javascript·笔记·学习·selenium·测试工具·安全
字节跳动安全中心5 小时前
智能体防御 | 一文了解3种系统提示词加固方法
安全·llm
时光追逐者5 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 50 期(2025年8.11-8.17)
c#·.net·.netcore·.net core
一个会的不多的人6 小时前
C# NX二次开发:操作按钮控件Button和标签控件Label详解
开发语言·c#
咕白m6256 小时前
C# 实现 PDF 转图片 - 分辨率设置、图片格式选择
后端·c#
黑客影儿8 小时前
黑客哲学之学习笔记系列(三)
笔记·学习·程序人生·安全·职场和发展·网络攻击模型·学习方法
与火星的孩子对话8 小时前
Unity高级开发:反射原理深入解析与实践指南 C#
java·unity·c#·游戏引擎·lucene·反射
XY_墨莲伊9 小时前
【网络安全实验报告】实验六: 病毒防护实验
安全·web安全