回答
可以与多个单个进程 线程导致静态类是 创造了不止一次?
不,多个线程都将指向相同的静态类。
如果我只需要一个简单的构造可以 我用一个静态类,还是我要 再打单身?
不太明白你的问题。但是一般情况下,当你需要全局数据访问时,你使用Singleton。您可以使用静态成员与静态类相同的东西。但是这使得代码更丑陋,因为有太多的静态关键字,如果你想放弃全局访问策略并使用更多的OOP方法,就会让你的生活变得困难。
然而,与静态类相比,单例是一种更受欢迎的方法。
编辑:您可能需要阅读此:static classes are not thread-safe
不能创建一个静态类... 但正常类的静态实例的实例,将超过所有线程相同
我觉得当你说“创建”你真的是指“实例化”,实例化是创建该类的一个对象。静态类永远不会实例化。它们本质上是全局变量和函数的集合。
每个静态成员变量的一个实例在运行时创建,它们将在所有线程之间共享。
我不同意。任何尝试访问它们的静态类都会被实例化。他们有自己的静态构造函数,您可以在其中定义自己的逻辑。 – 2009-11-20 15:21:02
尽管“静态构造函数”背后存在着令人奇怪且令人困惑的命名决定,但没有创建静态类的实例。该类正在被加载,初始化,使用,但* not *“实例化”。 – 2009-11-20 15:33:51
+1 YES ...静态类未实例化。类型结构为您的应用程序中使用的每种类型创建一次,不是类型的实例或instaiation ...它是一个类型定义结构。 @myotherm,此类型结构(称为CORINFO_CLASS_STRUCT)包含Runtimetype信息。当一个对象被实例化时,对象头部包含一个指向这个东西的指针。 – 2009-11-20 15:35:33
可以与多个单个进程 线程导致静态类是 创造了不止一次?
不管线程的数量多少,在一个进程中获取多个静态.NET类(成员)的多个实例的唯一方法是创建新的AppDomain。每个AppDomain将有一个静态类(成员)的实例。
编辑:
我要补充的是在过程和应用程序域的数目的线程数是分开为好。如果需要,单线程进程可创建任意数量的AppDomain。此外,只有程序流程是否有任何额外的线程调用其他AppDomain。这可能会造成多线程访问静态类的多个实例的情况,但除非您自己明确创建此场景,否则不会发生这种情况。
如果我只需要一个简单的构造可以 我用一个静态类,还是我要 再打单身?
这似乎不清楚你要在这里问什么。静态类成员按概念表示单身人士。如果你问这是否是一个创建简单构造的好方法,那么答案可能是。这取决于你的需求。大多数人会争辩说,你应该只使用一个常规的类定义并且只创建一个实例。
鉴于你的两个问题的联合,我会推测,也许你问是否可以通过使用静态类创建一个单例作为一个单例。答案是肯定的,因为除非您的代码明确创建了一个新的AppDomain,否则您将不会自动拥有新的AppDomain,或者您导入的代码使用您的程序集创建新的AppDomain。
具有多个线程的单个进程是否会导致多次创建一个静态类?
Yes you can,虽然它有点不寻常(甚至想)。它需要单独的AppDomain或使用ThreadStaticAttribute。这两者中的任何一个都会为您提供一个不与其他静态实例共享状态的独立实例。
如果我只是需要一个简单的构造,我可以使用静态类,或者我必须诉诸单身?
您可以使用。单例允许你像静态一样使用非静态类,并且为管理生命期提供了一些额外的灵活性。
- 1. 一个类可以返回它自己的静态实例吗? (在C#)
- 2. 在PHP 5中,我可以动态地实例化一个类吗?
- 3. 我可以在实例化一个匿名类时实现一个接口吗?
- 4. 通用静态类有多个实例?
- 5. 类可以实例化另一个类吗? (PHP)
- 6. Java,静态方法可以实例化一个被调用的对象吗?
- 7. 你可以在另一个项目中实例化一个类吗?
- 8. 我可以从Worker线程调用静态类实例的静态方法吗?
- 9. 一个静态方法总是可以转换为一个实例方法吗?
- 10. 我可以在JavaScript中动态地将一个类的实例转换为另一个类的实例吗?
- 11. 从JRuby中实例化一个非静态Java内部类
- 12. 在Python中的类中创建一个类的静态实例
- 13. 静态引用一个类的'this'实例而不曾实例化该类的一个实例?
- 14. 多次实例化一个@ViewChild,所以我可以再次使用HTML Angular 4
- 15. 在JAVA中是静态方法创建单个实例吗?
- 16. IWindsorContainer可以通过静态方法实例化吗?
- 17. PyPy可以在一个进程中使用多个CPU吗?
- 18. 跨多个工作进程刷新静态实例
- 19. 在c中访问一个实例类的静态类型#
- 20. 我可以在Google App Engine上实例化2个memcache类吗?
- 21. 如何设计一个可以仅由1个类实例化的单例
- 22. node.js多次实例化类
- 23. 从另一个动态实例化类
- 24. 静态类是否可以包含实例初始化块?
- 25. 你可以在同一个HTML表单上有多个Plupload实例吗?
- 26. 我可以在C++中返回对该类中的静态类(单例)实例的引用吗?
- 27. singleton类可以静态吗?
- 28. ASP.MVC中的Getter和Setter可以实例化一个对象吗?
- 29. 每个线程有多个NSManagedObjectContext实例可以吗?
- 30. 我可以在Java中声明一个实例变量并在静态初始化块中使用它吗?第一次加载类时
您已经回答了我的问题:) 对于我正在处理的特定问题,我需要在两个线程之间全局访问一个资源。我让他们用一个名为EventWaitHandle的信号互相发送信息,但是之后需要发送一个字符串到另一个字符串。我把它放在一个Queue中的静态类中,它被lock(){}保护,以便被另一个线程检索,但是不确定2个线程是否会得到相同的静态类。 – 2009-11-20 15:17:17