zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    复制代码

     
     
  • 相关阅读:
    Android 内存剖析 – 发现潜在问题
    Android内存泄漏问题(一)
    Android的事件处理机制详解(二)-----基于监听的事件处理机制
    Android的事件处理机制(一)------基于回调机制的事件处理
    OOA、OOD 和 OOP
    面向对象初识
    Python 2 和 Python 3 的区别
    软件开发规范
    语法分析和词法分析
    循环删除的坑
  • 原文地址:https://www.cnblogs.com/soundcode/p/6571182.html
Copyright © 2011-2022 走看看