并发编程-初始线程-同步之lock 时间:2018/10/27

线程同步的方法之lock

先看一个简单的例子

namespace _005进程同步lock
{
    class Program
    {
        static int val1 = 0; //两个线程都操作的一个静态变量

        static void Main(string[] args)
        {
            //线程t1每隔一毫秒给val1++ 执行1000次
            Thread t1 = new Thread((() =>
            {
                for (int i = 0; i < 1000; i++)
                {
                    val1++;
                    Thread.Sleep(1);
                }
            }));
            t1.Start();
            //线程t2每隔一毫秒给val1++  执行1000次
            Thread t2 = new Thread((() =>
            {
                for (int i = 0; i < 1000; i++)
                {
                    val1++;
                    Thread.Sleep(1);
                }
            }));
            t2.Start();

            t1.Join();//等待线程t1结束
            t2.Join();//等待线程t2结束
            //while (t1.IsAlive){ }
            //while (t2.IsAlive){ }
            Console.WriteLine(val1);//打印结果
        }
    }
}

这里有两个线程并发为一个变量++1000次,如果没有同步手段的话就可能出现这种情况:“进程t1读出变量val1的值为99,然后为它++,将++后的结果100赋值给变量val1,可能这个时候线程t2也已经读出这个99的值并且++了好几次变成了105,此时线程t1再去给val1赋值时就让线程t2干的活白做了!”

现在使用lock来解决这个问题

namespace _005进程同步lock
{
    class Program
    {
        #region 同步问题的引入
        /*
        static int val1 = 0; //两个线程都操作的一个静态变量

        static void Main(string[] args)
        {
            //线程t1每隔一毫秒给val1++ 执行1000次
            Thread t1 = new Thread((() =>
            {
                for (int i = 0; i < 1000; i++)
                {
                    val1++;
                    Thread.Sleep(1);
                }
            }));
            t1.Start();
            //线程t2每隔一毫秒给val1++  执行1000次
            Thread t2 = new Thread((() =>
            {
                for (int i = 0; i < 1000; i++)
                {
                    val1++;
                    Thread.Sleep(1);
                }
            }));
            t2.Start();

            t1.Join();//等待线程t1结束
            t2.Join();//等待线程t2结束
            //while (t1.IsAlive){ }
            //while (t2.IsAlive){ }
            Console.WriteLine(val1);//打印结果
        }
        */
        #endregion

        #region 使用lock解决同步问题

        static int val1 = 0; //两个线程都操作的一个静态变量
        static object locker = new object(); //叫什么都可以

        static void Main(string[] args)
        {
            //线程t1每隔一毫秒给val1++ 执行1000次
            Thread t1 = new Thread((() =>
            {
                for (int i = 0; i < 1000; i++)
                {
                    lock (locker)
                    {
                        val1++;
                    }
                    Thread.Sleep(1);
                }
            }));
            t1.Start();
            //线程t2每隔一毫秒给val1++  执行1000次
            Thread t2 = new Thread((() =>
            {
                for (int i = 0; i < 1000; i++)
                {
                    lock (locker)
                    {
                        val1++;
                    }
                    Thread.Sleep(1);
                }
            }));
            t2.Start();

            t1.Join();//等待线程t1结束
            t2.Join();//等待线程t2结束
            //while (t1.IsAlive){ }
            //while (t2.IsAlive){ }
            Console.WriteLine(val1);//打印结果
        }
        #endregion

    }
}

此时同步问题就解决了!

猜你喜欢

转载自blog.csdn.net/u014793452/article/details/83422364