在.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;}}
}

static与线程安全 -摘自网络相关推荐

  1. Android下基于线程池的网络访问基础框架

    引言 现在的Android开发很多都使用Volley.OkHttp.Retrofit等框架,这些框架固然有优秀的地方(以后会写代码学习分享),但是我们今天介绍一种基于Java线程池的网络访问框架. 实 ...

  2. 常见的加密算法 (转自: http://blog.chinaunix.net/uid-8735300-id-2017079.html 本文摘自网络 ,如有雷同 请及时联系我 谢谢)...

    本文摘自网络 ,仅为个人学习记录之用,如有雷同 请及时联系我 谢谢 实例参考: http://www.cnblogs.com/Continue/archive/2009/11/20/1606862.h ...

  3. 做一个让人欣赏的女人--摘自网络

    摘自网络 愚笨的女人打击男人: 聪明的女人激励男人. 愚笨的女人盯着男人的缺点,老是生气: 聪明的女人欣赏男人的优点,很是开心. 愚笨的女人不分场合与男人争吵,弄得男人很没面子: 聪明的女人在外人面前 ...

  4. 线程id 获取线程名称_016 线程及初步网络编程

    涉及内容:多线程的安全问题.线程的优先级.暂停线程的执行.线程同步.死锁和死锁的解决办法.生产者消费者模式的实现.网络编程三要素.IP端口及Socket的含义 1. 获取线程基本信息的方法 (1) 获 ...

  5. c++ socket线程池_java 网络编程,Socket编程

    Java的网络编程主要涉及到的内容是Socket编程,那么什么是Socket呢?简单地说,Socket,套接字,就是两台主机之间逻辑连接的端点.TPC/IP协议是传输层协议,主要解决数据如何在网络中传 ...

  6. 数据库集群技术 -摘自网络

    简介 当今世界是一个信息化的世界,我们的生活中无论是生活.工作.学习都离不开信息系统的支撑.而信息系统的背后用于保存和处理最终结果的地方就是数据库.因此数据库系统就变得尤为重要,这意味着如果数据库如果 ...

  7. 处理WinForm多线程程序时的陷阱(摘自网络)

    与所有的UI开发平台一样,.NET下线程开发图形界面同样要遵循一个基本原则:就是对UI对象的操作一定要在产生该UI对象的线程里进行(该线程称作UI线程),因为大部分UI对象都不是线程安全的. 在.NE ...

  8. 多线程调用static方法线程安全问题

    最近在工作中遇到了线程安全的问题,是在一个方法中调用了静态方法解析Date的字符串. 因为 SimpleDateFormat这个类是线程不安全的,所以不能在静态方法中定义全局的成员变量. @Test ...

  9. centos7设置static时,无法连接网络

    背景 centos7的环境中打开浏览器,上不了网,尝试重装后依旧如此.怀疑是BOOTPROTO="static"的问题,设置为dhcp后,发现可以上网.但是设置为dhcp动态获取i ...

最新文章

  1. golang strings.Fields 使用
  2. 使用ExpandableListView以及如何优化view的显示减少内存占用
  3. java单例模式的实现方法_Java中的五种单例模式实现方法
  4. pandas使用shift函数对数数据进行向上偏移(-1)或者向下偏移(1)、索引不移动,移动之后无值的赋值为NaN、将原数据列与偏移后的数据列相加生成新的数据列
  5. 【jQuery 区别】.click()和$(document).on(click,指定的元素,function(){});的区别
  6. 微软拟对Office 2007增添新功能 增强安全性
  7. Python 技术篇-用smtplib和email库实现邮件发送各种类型的附件实例演示
  8. mysql5.7重置密码windows_MySql 5.7 for Windows 重置root密码
  9. flex 错误信息类型及解决方法
  10. java笔试之计算n x m的棋盘格子
  11. 服务器重装系统需要按什么,安装服务器系统前我们该做些什么
  12. The program ‘roscore‘ is currently not installed 解决办法
  13. android集成第三方---集成wps实现文档阅读功能
  14. linux date 4 2,JZ2440 linux-3.4.2内核启动报错:Verifying Checksum ... Bad Data CRC(示例代码)...
  15. carsim/trucksim获取轮胎侧偏刚度、纵向刚度
  16. axis2 异常OMElement
  17. IOS应用程序崩溃日志分析
  18. 爬取B站20万+条弹幕,我学会了如何成为B站老司机
  19. 创蓝253-创蓝万数平台图像识别OCR技术
  20. c语言剪刀石头布游戏程序,什么方法最简单编剪刀石头布程序

热门文章

  1. 揭开源码的神秘面纱,让源码从此无处藏身
  2. getgrgid()函数
  3. python中时间的加n和减n运算
  4. fedora学习笔记 6:浅谈linux文件系统
  5. jQuery mobile网格布局
  6. 《『若水新闻』客户端开发教程》——17.软件自动更新
  7. 剔除List中的重复值
  8. Tornado 上传文件及存储
  9. storm-starter 例子学习
  10. 漏洞10年深藏不露,PHP 项目依赖关系管理工具Composer安全吗?