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);
    }
相关推荐
你的人类朋友7 小时前
什么是OpenSSL
后端·安全·程序员
支付宝体验科技12 小时前
AI4SDL:支付宝业务应用研发安全保障体系建设实践
安全
小码编匠15 小时前
WPF 中的高级交互通过右键拖动实现图像灵活缩放
后端·c#·.net
没逻辑17 小时前
Post-Quantum HTTPS:未来的安全通信架构
后端·安全
LH_R19 小时前
OneTerm开源堡垒机实战(四):访问授权与安全管控
运维·后端·安全
唐青枫1 天前
C#.NET 定时任务与队列利器:Hangfire 完整教程
c#·.net
hez20101 天前
Runtime Async - 步入高性能异步时代
c#·.net·.net core·clr
mudtools2 天前
.NET驾驭Word之力:玩转文本与格式
c#·.net
LH_R2 天前
OneTerm开源堡垒机实战(三):功能扩展与效率提升
运维·后端·安全
唐青枫2 天前
C#.NET 数据库开发提速秘籍:SqlSugar 实战详解
c#·.net