Comportamento do carregador de classe no Tomcat com vários aplicativos

Em um servidor Tomcat 5.5, eu coloco uma classe no caminho de classe do sistema (e modifico o catalina.bat para selecioná-lo) ou se eu coloco a classe no diretório lib compartilhado. Agora, se eu tiver dois aplicativos diferentes usando a mesma classe que não a possuem nos diretórios WEB-INF lib / classes, eles usarão a mesma instância da classe. Eu entendo o conceito que um carregador de classes delegará ao seu carregador de classes pai para encontrar uma classe, caso não consiga encontrá-la. Nesse caso, uma vez que a classe não está presente nas WEB-INF / classes ou WEB-INF / lib the O WebAppX classloader tentará o classloader compartilhado, comum e do sistema, respectivamente.

No entanto, isso de alguma forma me parece estranho que dois aplicativos diferentes possam compartilhar um contexto usando esse método. Alguém poderia me ajudar a entender por que isso é assim. por exemplo. no código abaixo, os dois servlets são implantados em guerras separadas enquanto o CommonCounter é compartilhado e podem ler os valores dos contadores incrementados pelo outro.

Editar Parece contra-intuitivo para mim que dois aplicativos separados possam compartilhar um contexto dessa maneira. De fato, se eles tiverem a mesma instância da classe, poderão até implementar multithreading / sincronização em dois aplicativos diferentes, o que parece extremamente contra-intuitivo.

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

questionAnswers(1)

yourAnswerToTheQuestion