博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
static与线程安全 -摘自网络
阅读量:6554 次
发布时间:2019-06-24

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

在.Net中,Static会经常和线程的东西扯在一起。写的代码是不是线程安全呢?好多程序员都在想,不过,有时候随便就放过了。真正出问题的时候再想。其实,如果程序员一开始就明白这里面的机制,也许,编写的代码质量会更加的高。也少些线程安全的烦问题。事实上,了解线程安全的机制后,你会发现,这原来是很简单的事情,只是很多人不愿意去了解线程。因为对于普通的程序员,线程的东西真是不好玩的,也不太过瘾,同时好容易出错。生活中的例子顾客一次买了10个产品去收银处交钱,一般来说,收银处的框台应该很多的,顾客可以选一个人少的结帐就行了。而收银员可以一个个顾客地处理。这当然是有条不紊的事了。实际上,每个收银员就是一个线程,如果一个框台对于一个收银员的话,也就真是没有问题了。框台就是一个资源。但是对于操作系统而言,资源往往是很宝贵的,要提供给多个收银员使用。即线程共享地使用资源。而操作系统的调度经常是没有道理的,也就是随意性很大。一时由收银员A操作,一时由收银员B操作。试想想,收银员A,B都不能很好地做自己的事情,而且操作的数据会很混乱。也根本不知道对不对。不过,如果收银员A可以在一段时间内独占框台,事情也就会很容易了。这样虽然导致排队的用户很多,效率也低,但是每一个顾客的数据都处理正确的。这其实就是线程安全的问题,如果一个线程把资源锁住了,别的线程在排除,数据就会很正确的。Static代码例子下面的代码,无论你使用多少的线程来控件,都是安全的。因为线程之间,不会共享什么资源,唯一相同的是使用了同一个逻辑。其实这是在破坏线程的前题方面下功夫,出现线程不安全的条件都没有了,那肯定就是线程安全的。class CheckoutLane{    public static float GetTotal(Cart cart)    {        float total = 0;        for (int i = 0; i < cart.GroceryItems.Length; i++)        {            total += cart.GroceryItems[i].Price;             Thread.Sleep(100);        }        return total;    }}而下面的代码,不是线程安全的,因为共享了static float total;这个资源,而各个线程都随机都被调用,可以任意修改total这个数据。这个,就正如多个收银员共享柜台,任意执行收银操作一样。class CheckoutLane{    static float total;    public static float GetTotal(Cart cart)    {        total = 0;        for (int i = 0; i < cart.GroceryItems.Length; i++)        {            total += cart.GroceryItems[i].Price;              Thread.Sleep(100);        }        return total;    }}下面的代码是线程安全的,使用了lock关键字,可以达到一个线程强占资源的效果。这时,synchLock就作为了共享的资源,被某一个线程锁住了。class CheckoutLane{    static float total;    static object synchLock = new object();    public static float GetTotal(Cart cart)    {        lock(synchLock)        {            total = 0;            for (int i = 0; i < cart.GroceryItems.Length; i++)            {                total += cart.GroceryItems[i].Price;                  Thread.Sleep(100);            }            return total;        }    }}

 

转载地址:http://fntco.baihongyu.com/

你可能感兴趣的文章
第一周 从C走进C++ 002 命令行参数
查看>>
【java】itext pdf 分页
查看>>
看看这个电脑的配置
查看>>
[转]【NoSQL】NoSQL入门级资料整理(CAP原理、最终一致性)
查看>>
RequireJS进阶(二)
查看>>
我设计的网站的分布式架构
查看>>
linux extract rar files
查看>>
Knockout.Js官网学习(监控属性Observables)
查看>>
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务解决
查看>>
azure之MSSQL服务性能测试
查看>>
Android BitmapFactory.Options
查看>>
前端构建:Less入了个门
查看>>
phonegap(cordova) 自己定义插件代码篇(三)----支付宝支付工具整合
查看>>
linux 批量进行:解压缩某一类压缩文件类型的文件
查看>>
激活modelsim se 10.4 时运行patch_dll.bat不能生成TXT
查看>>
17秋 软件工程 Alpha 事后诸葛亮会议
查看>>
线性空间
查看>>
疑似checkpoint堵塞数据库连接
查看>>
Node.js中针对中文的查找和替换无效的解决方法
查看>>
理解指针的关键
查看>>