C# 线程安全与 lock锁

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 
  或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 
  线程安全问题都是由全局变量及静态变量引起的。 
  若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时对一个变量执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

lock的目的是防止多线程执行的时候出现并发操作问题,加上lock的引用类型的对象,在其锁定的区域内,在一个时刻只允许一个线程操作。

lock只能锁定一个引用类型变量,也就是锁定一个地址

class Program

    {
        static void Main(string[] args)
        {
        threda t=new threda();
        threda.obj.i = 10;
        Thread th1 = new Thread(new ThreadStart(t.hhh));
        th1.Name = "th1";
        th1.Start();

        Thread th2 = new Thread(new ThreadStart(t.hhh));
        th2.Name = "th2";
        th2.Start();
        }
    }

 

class threda
    {
        public static sss obj = new sss();

        public void hhh()
        {
            lock (obj)
            { 
                for (int i = 0; i < 7; i++)
                {
                    Thread.Sleep(500);
                    
                    if (obj.i >0)
                    {
                        obj.i--;
                        Console.WriteLine("当前线程名:"+Thread.CurrentThread.Name+", obj.i= " + obj.i);
                    }
                }
            }
        }
        
    }

    class sss
    {
       public int i ;
    }

 

加锁和不加锁运行的结果有区别 :

加锁后:i的值会一个个递减,不会出现跳跃,不会出现重复输出,一直到0值;

不加锁:i的值输出会出现跳跃,不连续递减,可能还会出现-1值输出;

原因:加锁后,一个时刻只能有一个线程执行被锁区域的代码,两个线程都是有先后顺序执行的,所以不会出现间断输出。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值