什么是线程同步?又如何解决线程同步问题?

线程同步问题就是解决多个线程同时操作一个资源的问题

    {
        private static int counter = 0;

        static void Main(string[] args)
        {
            Thread t1 = new Thread(() => {
                for (int i = 0; i < 1000; i++)
                {
                    counter++; Thread.Sleep(1);
                }
            });
            t1.Start();

            Thread t2 = new Thread(() => {
                      
                for (int i = 0; i < 1000; i++)
                {
                    counter++; Thread.Sleep(1);
                }
            }); t2.Start();

            while (t1.IsAlive) { };
            while (t2.IsAlive) { };
            Console.WriteLine(counter);
            Console.ReadKey();
        }
    }

上面分别开启了两个线程来同时运行,打印结果是多少?反正不会是2000,不信自己验证下,反正代码都放在这里了。

注意: while (t1.IsAlive) ;操作会大量消耗 cpu 空转,可以改成 t1.Join()就是让当前线程等待 t1 线程的结 束。

关于如何解决上面打印结果不是2000的问题(这就是两个线程同步都在运行,带来的结果误差)

一种方式我们首先应该想到的是加锁(lock),改用 lock 解决多个线程同时操作一个资源。lock 是 C#中的关键字,他要锁定一个资源,lock 的 特点是:同时只能有一个线程进入

lock 的对象的范围,其他 lock 的线程就要等。

    {
        private static int counter = 0;
        private static object locker = new object();
        static void Main(string[] args)
        {
            Thread t1 = new Thread(() => {
                for (int i = 0; i < 1000; i++)
                {
                    lock (locker)
                    { counter++; }
                    Thread.Sleep(1);
                }
            });
            t1.Start();

            Thread t2 = new Thread(() => {
                      
                for (int i = 0; i < 1000; i++)
                {
                    lock (locker)
                    { counter++; }
                    Thread.Sleep(1);
                }
            }); t2.Start();

            while (t1.IsAlive) { };
            while (t2.IsAlive) { };
            Console.WriteLine(counter);
            Console.ReadKey();
        }
    }

最后运行正确是2000,不信自己玩下。

上一篇:吴恩达谈人工智能:它将影响每一个行业


下一篇:团队IM工具BearyChat 获千万级 A 轮融资,华诺创投领投