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);
    }
相关推荐
CDN3602 分钟前
中小团队安全方案:360CDN 高防服务器基础配置
运维·服务器·安全
码农小白AI13 分钟前
AI审核加持的IACheck:临电配电箱安全检测报告如何确保用电安全
安全
似水明俊德34 分钟前
16-C#.Net-自研ORM框架-学习笔记
windows·笔记·学习·c#·.net
算法-大模型备案 多米40 分钟前
算法备案算法安全自评估报告模板(精简版)
大数据·人工智能·安全·语音识别·文心一言
IT观测44 分钟前
深析倍思充电宝其技术优势与安全标准
安全
A_nanda44 分钟前
C#类型转换最佳实践
java·jvm·c#
亚远景aspice1 小时前
亚远景-ISO 21434:汽车网络安全全生命周期风险管理的技术框架
运维·网络·安全
唐青枫1 小时前
C#.NET System.Threading.Lock 深入解析:新一代 lock、底层语义与使用边界
c#·.net
步步为营DotNet1 小时前
全面解读C# 14在云原生微服务开发中的创新应用
微服务·云原生·c#
xingxin3211 小时前
日志文件分析溯源(连接WebShell的IP地址)实验报告
安全·web安全·网络安全·php·文件上传