并发编程-初始线程-同步之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

    }
}

此时同步问题就解决了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值