堆栈溢出。假设我想初始化一个非静态类变量,其中两个是UserID(int)和MyDictionary(Dictionary)。这个非静态类是在静态类中声明的(并且在静态类的成员之一中初始化)。 如果脚本运行时间过长而另一用户访问同一页面,则新用户有可能会改变其他用户的MyDictionary的内容。但我不明白这是如何可能的,因为MyDictionary是在一个非静态类。有没有人明白这一点?谢谢。在静态类中的ASP.NET非静态类Thread-Safety
0
A
回答
1
所以我假设代码看起来有点像这样的权利?
public class MyNonStaticClass
{
public int UserID;
public Dictionary<int, string> MyDictionary
= new Dictionary<int, string>;
}
public static class MyStaticClass
{
public static MyNonStaticClass aStaticInstanceOfTheNonStaticClass
= new MyNonStaticClass();
public static void AddToDictionary(int key, string value)
{
aStaticInstanceOfTheNonStaticClass.add(key, value);
}
}
通过声明静态类内的对象作为一个静态变量,你基本上是说“在我的应用我想其中的一个;而只有其中一个”;所以即使班级不是静态的,你仍然在创建一个静态实例。
+0
男人,我想了一个小时左右,你的答案证实了这一点。谢谢。 – user1325179 2012-04-10 23:53:37
0
因为包含类和访问成员是静态的,所以它使用单一的内存空间。你必须假定静态类的引用(本例中为本地,字段或属性)也是静态的(即使它们是非静态类的实例)。
这个类是静态的原因是什么?如果你使用的是共享逻辑,为什么不通过引用静态方法传递字典?
1
静态(或缺乏)不是影响线程安全。静态仅仅意味着类成员(属性,字段,方法或构造函数)与类型相关联,而不与类别的特定实例相关联。
我可以编写非线程安全的静态代码(如您在问题中描述的代码),并且可以编写线程安全的实例代码,反之亦然。下面是一些非线程(坏)代码,沿着什么,我觉得你行或多或少都在做:
public static class MyFoo {
// Just because this is a static property doesn't
// mean the contained dictionary is thread safe!
public static Dictionary<String, String> MyDictionary { get; set; }
public static MyFoo() {
MyDictionary = new Dictionary<String, String>();
}
}
如果你需要存储用户特定的信息在ASP.NET中使用会话对象或(对于更长寿命的数据)数据库。永远不要依赖静态变量 - 如果两个用户同时在网站上,该怎么办?
相关问题
- 1. 静态与非静态类
- 2. 访问非静态类的静态类
- 3. 静态类中的静态变量和非静态类中的静态变量
- 4. 从静态类触发非静态类?
- 5. Combinig静态类和非静态类
- 6. C#静态类 - 静态类不能有非静态成员
- 7. C# - 非静态类的静态事件
- 8. 非静态类的静态成员?
- 9. 声明类的静态和非静态
- 10. 想从非静态类访问静态成员的非静态子类的Java
- 11. 使用静态或非静态类
- 12. c#静态或非静态类
- 13. 声明非静态类静态
- 14. Java:非静态类和静态调用
- 15. 静态主类静态类?
- 16. 使用非静态方法中的内部类的静态类
- 17. IIS/WCF静态方法Threadsafety
- 18. 在一个静态类访问非静态类的价值
- 19. 抽象掉在静态方法在非静态类类型
- 20. 如何在非静态类
- 21. 非静态类中的静态方法和静态类中的静态方法有什么区别?
- 22. 在Java中的非静态类中声明静态变量
- 23. 在静态中使用非静态的自定义类void main
- 24. 在swift类的静态函数中访问非静态常量
- 25. 如何序列化非静态子类的静态类
- 26. C#的WinForms从静态类传递字典非静态Form类
- 27. Java - 非静态类的扩展静态类
- 28. 在非静态类中锁定静态变量是否安全?
- 29. 在静态内部类中引用非静态变量
- 30. 在静态SQLiteDatabase类中调用非静态方法
你从哪里得到它的一个用户将能够修改其他人使用的服务器端的东西?如果我没有弄错的话,服务器为每个用户提供独立的线程和内存。另外,我建议您将所有课程放在单独的文件中,除非您的私人课程仅用于一个班级。 – MarioDS 2012-04-10 22:40:18