2012-07-06 38 views
0

當我從withing一個servlet訪問一個單Java對象,該對象僅是「單」或「一個實例」爲給予servlet線程或單整個JVM服務器操作系統(如Linux)上?辛格爾頓對象和Java servlet

當客戶端連接到該servlet /服務,我的意思是,單獨的對象是唯一爲每個客戶端或整個安裝在機器整個JVM其獨特的創造每一個線程?

回答

3

我認爲目標是爲每個用戶唯一的,而不是整個JVM。唯一的持久性信息是您在用戶會話中輸入的信息。

我不確定,但我認爲你可以在整個應用服務器上使用ClassLoader class來實現類的一個實例,但我不知道它是如何完成的。

UPDATE:

從Java文章"When is a Singleton not a Singleton?"

多單身人士同時通過不同類加載器 當兩個類加載器加載一個類,你確實有這個類的兩個副本加載服用,並且每個人都可以擁有自己的Singleton實例。這在運行於某些servlet引擎(例如iPlanet)中的Servlet中尤爲重要,其中每個servlet默認使用自己的類加載器。實際上,訪問聯合Singleton的兩個不同servlet將獲得兩個不同的對象。

多類加載器比您想象的更常見。當瀏覽器從網絡加載小應用程序使用的類時,它們爲每個服務器地址使用一個單獨的類加載器。類似地,Jini和RMI系統可以使用一個單獨的類加載器來提供它們下載類文件的不同代碼庫。如果您的系統使用自定義類加載器,則可能會出現所有相同的問題。

如果由不同的類加載器加載,兩個類具有相同的名稱,即使是相同的包名,被視爲不同的 - 即使,事實上,他們是字節爲字節同一類。不同的類加載器代表不同的名稱空間來區分類(即使類的名稱相同),這樣兩個MySingleton類實際上是不同的。 (請參閱參考資料中的「類加載器作爲名稱空間機制」。)由於兩個Singleton對象屬於兩個同名的類,所以乍一看會出現同一類的兩個Singleton對象。

+0

我曾經嘗試過使用一些REST風格的web服務,希望能夠擁有一些「狀態」,但這不可能,Singleton對於每個連接都是新的。 – hectorg87 2012-07-06 09:07:17

+0

哇,所有其他答案說不同。很高興看到一些實際的例子。我根據我的個人經驗回答。 – hectorg87 2012-07-06 09:10:22

+1

鏈接顯示中斷;它重定向到Java技術頁面。 – 2015-03-19 09:44:06

3

我會說這取決於單是如何實現的,但是對於給定的應用程序的所有請求在同一個虛擬機執行,所以它應該是爲所有請求一個實例。

編輯:這是假設類似於直接的辛格爾頓實現:

public class MySingleton { 
    private static MySingleton _instance; 

    // for sake of simplicity, I've left out handling of 
    // synchronization/multi-threading issues... 
    public static MySingleton getInstance() { 
     if (_instance == null) _instance = new MySingleton(); 
     return _instance; 
    } 
} 
+0

如何使唯一的客戶端請求唯一的實現唯一? – xybrek 2012-07-06 09:09:15

+0

然後你不需要一個單身 - 你想做什麼? – claesv 2012-07-06 09:25:39

+0

我正在嘗試創建一個「Manager」類,它將包含基於Http客戶端操作的一些值。值不應與其他Http客戶端操作混淆。 – xybrek 2012-07-06 09:27:53

0

當你創建一個Singleton實例,所有的請求實例將共享相同的實例,它使用當前的類加載器。

+0

所以你的意思是,所有的客戶端都會得到存儲在Singleton類中的相同數據,如果存儲的話? – xybrek 2012-07-06 09:08:22

+0

是的,它將確保所有客戶端共享相同的實例 – UVM 2012-07-06 09:09:48

+0

如何實現僅對客戶端請求唯一的單例實現,或者我只需要在servlet上創建一個靜態類? – xybrek 2012-07-06 09:10:58

0

由於所有Servlets都運行在一個運行在單個JVM上的網絡服務器上,因此所有servlet只有一個Singelton對象。

1

是的,它是Singleton。但是單身人士的範圍取決於班級的位置。

如果它位於應用程序內部,則它是該應用程序的單例。如果在另一個應用程序中存在相同的類,則爲該應用程序創建另一個對象,並且該應用程序是單例。

如果它位於應用程序之外並位於服務器內,則它是虛擬機的單例。