2013-08-27 79 views
8

Java如何確保內部每個JVM只有一個ENUM實例存在?它是在應用程序啓動時創建的,從那時起,當多個線程訪問它時,它只會返回在啓動時創建的對象?
或者它是否實現了類似於單例模式的雙重同步,即使多線程訪問它,也只會創建一個istance?java如何確保每個JVM只有一個枚舉實例

+1

它確保每個類加載器有一個實例。如果您有多個類加載器,則每個加載器都可以擁有自己的實例。它們是按需創建的。 (延遲加載)JVM擁有自己的互斥鎖。 –

回答

6

你可以在this answer中看到枚舉實例是靜態類字段,因此在第一次訪問類時被初始化爲類加載的一部分。

classloading is synchronized internally以便確保枚舉實例是單獨(同一類加載器中的單身,那就是,如果你有多個加載器加載相同的枚舉你會得到多個實例)

+0

謝謝。正常的靜態變量也是如此嗎?即一個靜態變量是否有被多個類加載器多次初始化的危險? – Victor

+1

@Victor - 是的。你不會看到它是普通的舊Java程序,但它與j2ee等更復雜的系統有一個共同的問題,你有多個類加載器 – radai

+0

@Victor靜態初始化是在類加載器的上下文中執行的。在有多個類加載器的情況下(例如在J2EE中是孤立的),只要那些非常類的加載器被隔離,它們就會被加載多次,並且不會收斂到其可以加載類的分級的任何級別(因爲請求一個加載意味着在一個公共父類加載器的緩存中返回一些東西)。 – Gamb

2

枚舉實例是在類加載時創建。如果同一個枚舉被多個類加載器加載(例如,當一個Web應用程序容器正在加載類加載遊戲時),則內存中將存在多個不兼容的實例。

+0

「不兼容實例」是什麼意思? – apersiankite

相關問題