星空网 > 软件开发 > ASP.net

.Net Static 与单例

Static 关键字作为修饰符可以用于类、方法和成员变量上。其含义是对于整个应用程序生命周期内,访问该修饰符修饰的对象/方法/变量都引用到同一实例(内存地址)。但正因如此在多线程下会出现线程安全问题:计数器字段count是静态的,在多线程下循环调用1000次Increase方法,得到的结果未必是1000

internal class Counter  {    public static int count = 0;    public static void Increase()    {      Thread.Sleep(10);      Counter.count++;    }  }

 

要解决这个问题,首先要了解Static的特性:

1.若修饰一个变量,即使是个值类型,如Int变量,该变量无论在何处使用都是同一个实例(内存地址)。此时它表现出了引用类型的特性,在方法中调用该静态变量,不是将该值类型放入栈中,而是指向该变量的指针。

2.静态类、变量、方法的内存分配是在应用程序编译时就已确定的,在应用程序初始化时就已分配好的,当应用程序生命周期结束时才被销毁。且他们既不存储在栈上也不在堆上,而是静态数据区中。正因如此才能被整个应用程序全局的访问到同一实例。 这里有一篇文章描述了静态存储区的详细:http://www.educity.cn/zk/bianyi/201307031614161496.htm

3.静态类不能继承或实例化,不能有普通构造函数,但可以有静态构造,用来初始化其中的静态成员。静态类只能有静态成员或方法。

4.静态构造函数既可以用在静态类中又可以用在普通类中。其作用就是为了提供合适的时机初始化静态成员。对于一个普通类里的静态成员,在应用程序启 动时即被初始化,此时连main函数都未开始执行,普通构造函数更是无法被调用。而拥有静态构造方法的类,其静态成员初始化将被延后到一旦类内任何静态成 员或静态方法被实际调用时,才会触发默认的初始化,然后是触发静态构造方法。静态构造只能被调用一次,只能初始化静态成员。若直接初始化该类,则静态构造先触发,再触发普通构造函数。

由此可见,最根本的原因是在同一时刻有两个线程同时访问静态资源,资源的状态同时修改而导致的。因此需要对共享资源局部串行化,也即线程安全的单例。

.Net Static 与单例.Net Static 与单例
  internal class LockCounter  {    public static int count = 0;    public static void Increase()    {      Thread.Sleep(10);        lock (typeof(LockCounter))      {                LockCounter.count++;      }    }  }

View Code

更进一步的,可以不适用Lock而是使用InterLocked进行原子操作

.Net Static 与单例.Net Static 与单例
  internal class InterLockCounter  {    public static int count = 0;    public static void Increase()    {      Thread.Sleep(10);      Interlocked.Increment(ref InterLockCounter.count);    }  }

View Code

而如果我们利用静态构造的该特性,我们可以将它用在实现简洁无锁的单例模式,而且是线程安全的,因为任何试图访问实例的线程都会触发静态构造初始化该对象实例之后才能访问,且静态构造只能被调用一次,不会出现多线程问题。





原标题:.Net Static 与单例

关键词:.NET

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

亚马逊欲购买印度零售公司Future Retail10%的股份:https://www.ikjzd.com/articles/104410
打击亚马逊跟卖的几种黑白帽玩法,你知道几种?:https://www.ikjzd.com/articles/104412
非热门品类如何通过推广脱颖而出?:https://www.ikjzd.com/articles/104413
美国已有23州通过立法,电商平台销售税将席卷全美?:https://www.ikjzd.com/articles/104414
美国政府又开听证会,这次是因为它!:https://www.ikjzd.com/articles/104415
中欧班列陆续开通多条跨境电商专线!:https://www.ikjzd.com/articles/104418
去日本入住酒店,东西随意用却有一个特殊“要:https://www.vstour.cn/a/411241.html
中国有哪些著名的酒店品牌。:https://www.vstour.cn/a/411242.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流