• C#多线程lock解决数据同步


    1.代码实例:

    复制代码
    public class ThreadTest4
    {
        public static void Init()
        {
            //多个线程修改同一个值,使用lock锁解决并发
            for (int i = 0; i < 4; i++)
            {
                Task.Factory.StartNew(ThreadMethod);
            }
        }
        public static int Number = 1;
        public static void ThreadMethod()
        {
            while (true)
            {
                lock (typeof(ThreadTest4))
                {
                    Number++;
                    Console.WriteLine("当前线程:{0},Number={1}", Thread.CurrentThread.ManagedThreadId, Number);
                    Thread.Sleep(500);
                }
            }
        }
    }
    复制代码

    使用lock锁前后结果对比:

    使用Lock锁前,多线程修改同一数据会出现相同结果,

    使用Lock锁后,修改数据保证了数据的在多个线程操作时的同步。

    2.使用Lock锁前后的性能对比:

    将同一变量Number累加到30,

    对于简单内容主线线程执行时间:5.8秒

    多线程线程同步执行时间:5.9秒

    多线程异步执行时间:1.5秒

    结论异步操作性能相对性能提升明显

    实例代码:

    复制代码
        public class ThreadTest5
        {
            public static void Init()
            {
                //多个线程修改同一个值,使用lock锁解决并发
                Start = DateTime.Now;
                for (int i = 0; i < 4; i++)
                {
                    Task.Factory.StartNew(ThreadMethod);
                }
            }
            public static DateTime Start { get; set; }
            public static int Number = 1;
            public static void ThreadMethod()
            {
                while (true)
                {
                    lock (typeof(ThreadTest4))
                    {
                        Number++;
                        if (Number > 30)
                        {
                            StopHandle();
                        }
                        Console.WriteLine("当前线程:{0},Number={1}", Thread.CurrentThread.ManagedThreadId, Number);
                        Thread.Sleep(200);
                    }
                }
            }
            //结束处理
            public static void StopHandle()
            {
    
                //结束当前线程,并输出代码执行时间
                Console.WriteLine("ID={0}线程结束,结束Number={1},执行时长:{2}",Thread.CurrentThread.ManagedThreadId,
                    Number,
                    DateTime.Now-Start);
                //结束当前线程
                Thread.CurrentThread.Abort();
            }
        }
    复制代码

     
     
  • 相关阅读:
    防抖函数
    锁屏功能
    配置编译环境和线上环境之间的切换
    vue-router中的滚动行为
    axios的再次封装
    Anaconda 镜像配置
    Python 包管理工具 pip 与 conda
    Anaconda 安装与卸载
    VS Code 配置和使用
    解决 VS Code 无法使用Ctrl+C等快捷键
  • 原文地址:https://www.cnblogs.com/soundcode/p/6571182.html
Copyright © 2020-2023  润新知