回答
可以與多個單個進程 線程導致靜態類是 創造了不止一次?
不,多個線程都將指向相同的靜態類。
如果我只需要一個簡單的構造可以 我用一個靜態類,還是我要 再打單身?
不太明白你的問題。但是一般情況下,當你需要全局數據訪問時,你使用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. 在java中,類可以實例化爲靜態嗎?
- 2. 我可以創建一個內部靜態類的實例嗎?
- 3. 爲什麼我可以實例化一個靜態內部類?
- 4. 靜態類是一個單例嗎?
- 5. 在django中,我可以擁有多個靜態應用程序實例嗎?
- 6. 我可以有一個異常的靜態全局實例嗎?
- 7. 一個類可以返回它自己的靜態實例嗎? (在C#)
- 8. 在PHP 5中,我可以動態地實例化一個類嗎?
- 9. 我可以在實例化一個匿名類時實現一個接口嗎?
- 10. 類可以實例化另一個類嗎? (PHP)
- 11. Java,靜態方法可以實例化一個被調用的對象嗎?
- 12. 通用靜態類有多個實例?
- 13. 你可以在另一個項目中實例化一個類嗎?
- 14. 我可以從Worker線程調用靜態類實例的靜態方法嗎?
- 15. 我可以實例化一個指定的無狀態bean嗎?
- 16. 一個靜態方法總是可以轉換爲一個實例方法嗎?
- 17. 我可以在JavaScript中動態地將一個類的實例轉換爲另一個類的實例嗎?
- 18. 爲什麼我們可以一次實例化多個變量?
- 19. 創建一個類的靜態實例
- 20. 從JRuby中實例化一個非靜態Java內部類
- 21. 你可以禁止本地實例化一個類嗎?
- 22. POJO和CDI bean可以從同一個類實例化嗎?
- 23. 我可以爲一個變量分配一個靜態類嗎?
- 24. 在Python中的類中創建一個類的靜態實例
- 25. 靜態引用一個類的'this'實例而不曾實例化該類的一個實例?
- 26. 多次實例化一個@ViewChild,所以我可以再次使用HTML Angular 4
- 27. 你可以在一個成員函數中創建一個靜態變量,它只在該類的一個實例中是靜態的嗎?
- 28. 在JAVA中是靜態方法創建單個實例嗎?
- 29. IWindsorContainer可以通過靜態方法實例化嗎?
- 30. PyPy可以在一個進程中使用多個CPU嗎?
您已經回答了我的問題:) 對於我正在處理的特定問題,我需要在兩個線程之間全局訪問一個資源。我讓他們用一個名爲EventWaitHandle的信號互相發送信息,但是之後需要發送一個字符串到另一個字符串。我把它放在一個Queue中的靜態類中,它被lock(){}保護,以便被另一個線程檢索,但是不確定2個線程是否會得到相同的靜態類。 – 2009-11-20 15:17:17