打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
asp.net中关于静态变量的生命周期和线程安全以及一些类中的定义静态变量的概念
userphoto

2013.12.13

关注
asp.net中关于静态变量的生命周期和线程安全以及一些类中的定义静态变量的概念
public class StaticDictory
{
public static Dictionary<int, string> CataLog;
public static Dictionary<int, string> RoleName;
public int A;
public StaticDictory()
{
this.A = 5;
}
public StaticDictory(int B)
{
this.A = B;
}
static  StaticDictory()
{
CataLog = new Dictionary<int, string>();
CataLog.Add(1, "瑜伽部落");
CataLog.Add(2, "自行车部落");
CataLog.Add(3, "大学生部落");
RoleName = new Dictionary<int, string>();
RoleName.Add(1, "导师经销商");
RoleName.Add(2, "加盟经销商");
RoleName.Add(3, "金牌销售代表");
RoleName.Add(4, "银牌销售代表");
RoleName.Add(5, "战略合作伙伴");
RoleName.Add(6, "加盟经销商");
RoleName.Add(7, "练习者");
RoleName.Add(8, "管理员");
RoleName.Add(9, "超级管理员");
RoleName.Add(10, "生产线管理员");
RoleName.Add(11, "财务管理员");
RoleName.Add(12, "总经理管理员");
RoleName.Add(13, "总经理助理管理员");
RoleName.Add(14, "销售协议结构");
RoleName.Add(15, "明星销售代表");
RoleName.Add(16, "普通会员");
RoleName.Add(17, "普通会员");
RoleName.Add(18, "大学生首领");
RoleName.Add(19, "学生组织");
RoleName.Add(20, "大学生销售代表");
}
}
在类中只能定义一个静态的构造函数,是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了,他的生命周期下面有介绍。静态函数只能调用和初始化静态成员。实例化函数可以调用静态成员和实例化成员。同理静态函数不能调用实例化函数,实例化函数可以调用静态函数和实例化函数。
别的函数需要实例化,StaticDictory AA=new StaticDictory(6);实例话了对象,才可以调用实例化成员,类不写构造函数的话会有默认构造函数。
文章来自: 好喜爱学习网(http://www.haoxiai.net/) 网址:http://www.haoxiai.net/bianchengyuyan/aspnetbiancheng/82327.htmlasp.net中关于静态变量的生命周期和线程安全
本来我理解的静态变量的生命周期是
void Application_Start开始
void Application_End结束的,本来这就是对的
今天要做一个全局的应用,想确认一下,在网上一找,我的天,说什么的都有
大概分三种
1.Application_Start——Application_End
2.Session_Start——Session_End
3.类生命周期结束
我用4个机器做了一个测试发现静态变量值一直是不变的,并没有因为其它用户登录而被销毁,确认应该是Application级的
静态类在首次访问时会调用静态构造器创建类类型对象,类型对象的生存周期是整个应用程序域的生存周期,也就说被访问过的静态类,只有它所在的应用程序域被卸载时才会被卸载。
类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。
简单讨论一下在一个类中使用静态字段(static field)和静态方法(static method)是否会有线程安全问题。
我们在知道, 静态字段(static field)和静态方法(static method)的调用是通过类来调用。静态方法不对特定的实例操作,只能访问静态成员。实例方法可对特定的实例操作,既能访问静态成员,也能访问实例成员。
那么,在多线程中使用静态方法是否有线程安全问题?这要看静态方法是是引起线程安全问题要看在静态方法中是否使用了静态成员。
因为,在多线程中使用同一个静态方法时,每个线程使用各自的实例字段(instance field)的副本,而共享一个静态字段(static field)。所以说,如果该静态方法不去操作一个静态成员,只在方法内部使用实例字段(instance field),不会引起安全性问题。但是,如果该静态方法操作了一个静态字段,则需要静态方法中采用互斥访问的方式进行安全处理。
举个简单的例子,我们使用的Console.WriteLine();中WriteLine()是Console.WriteLine类的静态方法。
对于ASP.NET, 多个客户端访问服务器端, 这是一个多线程的例子.只要理解了原因,我们可以在三层架构中的数据访问层中放心使用静态方法(static method)来访问数据库.
静态方法如果没有使用静态变量,则没有线程安全问题。
为什么呢?因为静态方法内声明的变量,每个线程调用时,都会新创建一份,而不会共用一个存储单元。每个线程都会创建自己的一份,因此不会有线程安全问题
注意,静态变量,由于是在类加载时占用一个存储区,每个线程都是共用这个存储区的,所以如果在静态方法里使用了静态变量,这就会有线程安全问题!
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
单例模式
设计模式之一(单例模式)
java中静态语句块、实例代码块、构造器方法这3者的调用顺序
面试中的 Singleton
静态构造函数
static的理解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服