Classloader-Verhalten unter Tomcat mit mehreren Anwendungen

Auf einem Tomcat 5.5-Server füge ich eine Klasse in den Systemklassenpfad ein (und ändere catalina.bat, um sie auszuwählen) oder füge die Klasse in das gemeinsam genutzte lib-Verzeichnis ein. Wenn ich nun zwei verschiedene Anwendungen habe, die dieselbe Klasse verwenden und die Klasse nicht in ihren WEB-INF-Verzeichnissen lib / classes haben, verwenden sie dieselbe Instanz der Klasse. Ich verstehe das Konzept, dass ein Klassenladeprogramm an das übergeordnete Klassenladeprogramm delegiert, um eine Klasse zu finden, wenn sie nicht gefunden werden kann. In diesem Fall ist die Klasse in WEB-INF / classes oder WEB-INF / lib the nicht vorhanden Der WebAppX-Klassenladeprogramm versucht es mit dem gemeinsam genutzten Klassenladeprogramm, dem allgemeinen Klassenladeprogramm und dem Systemklassenladeprogramm.

Mir kommt es jedoch irgendwie komisch vor, dass mit dieser Methode zwei verschiedene Anwendungen einen Kontext gemeinsam nutzen können. Könnte mir jemand helfen zu verstehen, warum das so ist. z.B. Im folgenden Code werden die beiden Servlets jeweils in separaten Kriegen bereitgestellt, während CommonCounter gemeinsam genutzt wird, und sie können die Zählerwerte lesen, die von den anderen inkrementiert wurden.

Bearbeiten Mir erscheint es widersprüchlich, dass zwei separate Anwendungen auf diese Weise einen Kontext gemeinsam nutzen können. Wenn sie dieselbe Instanz der Klasse haben, können sie sogar Multithreading / Synchronisation für zwei verschiedene Anwendungen implementieren, was äußerst intuitiv erscheint.

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");
    }   
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage