static与线程安全 -摘自网络
2023-09-11 14:21:33 时间
在.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; } } }
相关文章
- java实现洛谷P3376【模板】网络最大流
- 重新点亮linux 命令树————网络配置的查看[十一三]
- Linux Centos 6.5网络启动不起来Bringing up interface eth0: Error:Connection activation failed:Device not man
- 【刷题】面筋-网络-浏览器中输入一个URL后,按下回车后发生了什么
- 关于内容分发网络 CDN 的可靠性和冗余性
- DayDayUp:《机器崛起前传》第二十二章【蹒跚而来】读后感(文章源自网络)—听课笔记
- Android 以太网(有线网络)开关和状态的判断
- 【智能算法】基于有导师监督的Kohonen网络的分类算法(建议收藏)
- 网络货运平台要智能,安全的数据底座少不了
- m分别使用BP神经网络和GRNN网络进行时间序列预测matlab仿真
- 华为运营商级路由器配置示例 | EVdPdNd L3VdPdNdv4 over SRv6 BE网络切片
- Linux基础之网络配置
- boost库在工作(35)网络服务端之五
- 终端安全——EDR终端检测和防护,终端设备包括计算机和笔记本电脑、移动电话、打印机、传真机、智能设备或连接到您网络的任何其他设备,甚至介入网络的服务器也算终端
- Mirai 通过弱密码爆破摄像头 形成僵尸网络——尼玛值得深思的是作者居然是做安全研究的
- 网络工程师面试题(面试必看)(5)