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);
    }
相关推荐
码农小旋风14 小时前
使用 ChatGPT 聚合站前,先看安全和隐私判断清单
人工智能·安全·自然语言处理·chatgpt·claude
曹牧14 小时前
C#:主线程能够捕获到子线程中的异常
开发语言·数据库·c#
Bruce_Liuxiaowei14 小时前
2026年5月第5周网络安全形势周报
人工智能·安全·web安全·ai·智能体
阿部多瑞 ABU15 小时前
AI红队攻防演化史(2023-2026):从虚拟角色到RLHF劫持——所有攻击方法全景总结与最新趋势分析
网络·人工智能·安全
Geometry Fu19 小时前
《物联网安全》第3.2章 无线传感器网络安全
物联网·安全·物联网安全·无线传感器网络·wsn
m0_7381207220 小时前
渗透测试基础——黑盒测试下的Web漏洞挖掘与利用解析(一)
服务器·前端·网络·安全·php
碳基硅坊20 小时前
Qwen3.5-9B在安全生产安全帽检测中的应用
人工智能·安全·安全帽检测·qwen3.5-9b
小江的记录本21 小时前
【JVM虚拟机】类加载机制:类加载全流程:加载→验证→准备→解析→初始化(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·算法·安全·spring·面试
jiayong2321 小时前
海量数据处理技术方案与实现原理
大数据·c#·linq