博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 线程安全与 lock锁
阅读量:6069 次
发布时间:2019-06-20

本文共 1459 字,大约阅读时间需要 4 分钟。

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 

  或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 
  线程安全问题都是由全局变量及静态变量引起的。 
  若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时对一个变量执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
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值输出;
原因:加锁后,一个时刻只能有一个线程执行被锁区域的代码,两个线程都是有先后顺序执行的,所以不会出现间断输出。

转载于:https://www.cnblogs.com/testsec/p/6095858.html

你可能感兴趣的文章
【分布计算环境学习笔记】7 语义Web
查看>>
只允许对象生成于堆内
查看>>
尝试Razor
查看>>
CRC16
查看>>
一步一步学习Vim 全图解释
查看>>
CPU,MPU,MCU,SOC,SOPC联系与差别
查看>>
公众号我也快看不下去了
查看>>
升级WebService图形服务,将K10.2和K10.3写到一个类库,所有服务放在一个类库
查看>>
[转] HTC:html组件
查看>>
编写高质量代码改善java程序的151个建议——导航开篇
查看>>
解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译)
查看>>
MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
查看>>
使用STM8SF103 ADC采样电压(转)
查看>>
PictureCutting图片批量裁切(裁剪)工具
查看>>
Android studio 中国的垃圾问题解决
查看>>
什么是服务台,他对企业有何作用
查看>>
产品经理网站列表
查看>>
转: HTTP Live Streaming直播(iOS直播)技术分析与实现
查看>>
Git 使用初体验
查看>>
Android Studio使用技巧系列教程(二)
查看>>