在Tomcat 5.5服務器上,我在系統類路徑中放置了一個類(並修改了catalina.bat來選擇它),或者將類放在共享lib目錄中。現在如果我有兩個不同的應用程序使用相同的類,它們的WEB-INF lib/classes目錄中沒有該類,它們將使用該類的同一個實例。我理解一個類加載器將委託給它的父類加載器以查找類的概念,因爲在這種情況下,因爲該類不存在於WEB-INF/classes或WEB-INF/lib中, WebAppX類加載器將分別嘗試共享,通用和系統類加載器。Tomcat上有多個應用程序的類加載器行爲
但是,這對我來說似乎很奇怪,即兩個不同的應用程序可以使用此方法共享上下文。有人能幫我理解爲什麼這樣。例如在下面的代碼中,兩個servlet每個都在單獨的戰爭中部署,而CommonCounter是共享的,並且他們可以讀取由另一個增加的計數器值。
編輯 這似乎直覺,我認爲兩個獨立的應用程序可以共享以這種方式的上下文。事實上,如果他們有相同的類實例,他們甚至可以在兩個不同的應用程序中實現多線程/同步,這看起來非常不直觀。
package com.test;
public class CommonCounter {
public static int servlet1;
public static int servlet2;
}
public class Servlet1 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
CommonCounter.servlet1++;
System.out.println("Other one had "+CommonCounter.servlet2+" hits");
}
}
public class Servlet2 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
CommonCounter.servlet2++;
System.out.println("Other one had "+CommonCounter.servlet1+" hits");
}
}
我不明白這個問題:你自己解釋一下,Tomcat的系統類加載器中的類是在所有應用程序之間共享的。因此,這兩個應用程序訪問相同的類,從而讀取相同的靜態字段,並可以看到彼此的效果。 – 2010-03-10 12:04:22
是的,但我覺得兩個獨立的應用程序可以以這種方式共享上下文。事實上,如果他們有相同的類實例,他們甚至可以在兩個不同的應用程序中實現多線程/同步,這看起來非常不直觀。 – saugata 2010-03-10 12:12:44