小编sau*_*ata的帖子


具有多个应用程序的Tomcat上的类加载器行为

在Tomcat 5.5服务器上,我在系统类路径中放了一个类(并修改catalina.bat来选择它),或者如果我将类放在共享的lib目录中.现在,如果我有两个不同的应用程序使用相同的类,它们的WEB-INF lib/classes目录中没有该类,则它们使用该类的相同实例.我理解一个类加载器将委托给它的父类加载器的概念,如果它找不到它,那么在这种情况下,因为该类不存在于WEB-INF/classes或WEB-INF/lib中WebAppX类加载器将分别尝试共享,公共和系统类加载器.

然而,这对我来说似乎很奇怪,两个不同的应用程序可以使用此方法共享上下文.有人可以帮我理解为什么会这样.例如,在下面的代码中,当共享CommonCounter时,两个servlet分别部署在单独的战争中,并且它们可以读取由另一个增加的计数器值.

编辑 对我而言,两个独立的应用程序可以以这种方式共享上下文.实际上,如果它们具有相同的类实例,它们甚至可以在两个不同的应用程序中实现多线程/同步,这看起来非常违反直觉.

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");
    }   
}
Run Code Online (Sandbox Code Playgroud)

java tomcat classloader

13
推荐指数
1
解决办法
8309
查看次数

Maven 3 - 仅针对特定 groupid 查找自定义存储库

是否可以告诉 maven 仅为某些特定的 groupid 查找用户定义的存储库?

似乎首先为所有工件尝试用户定义的存储库,最终需要更长的时间来构建。

[编辑]

例如,属于“com.example”组的工件托管在私有存储库中;但其他 OSS 工件,如“org.apache”、“org.codehaus”等不是。Maven 首先尝试在私有仓库中搜索第三方工件,然后在中央。我想将私有仓库查找过滤为仅“com.example”

maven-3 maven

10
推荐指数
1
解决办法
1645
查看次数

什么是"关键容器"?

它是特定的,具有明确的结构,还是只是一个任意数据文件,具有某种形式的加密来保存密钥,以及可能的其他秘密信息?有人可以解释这个术语或指向我的链接.

encryption cryptography public-key private-key

9
推荐指数
1
解决办法
5753
查看次数

我可以找出java程序是使用java还是javaw启动的

这与另一个用户的早期问题有关,询问如何检测代码是否在eclipse IDE中运行.

我注意到Eclipse总是启动程序javaw而不是java.(这并不意味着javaw从Eclipse启动的程序启动).

我可以找到使用的参数

RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean();
List<String> lst = RuntimemxBean.getInputArguments();
for (int i = 0; i < lst.size(); i++)
    System.out.println(lst.get(i));
Run Code Online (Sandbox Code Playgroud)

但这并没有告诉我它是否是使用java或启动的javaw.

  1. 有没有办法找出它是否是使用java或推出javaw
  2. 为什么Eclipse用于javaw启动程序?

java eclipse javaw

8
推荐指数
1
解决办法
3689
查看次数

在现实世界的Java应用程序中单例模式和破坏双重检查锁定

我正在阅读文章Double-checked locking和Singleton模式,关于双重检查锁定如何被破坏,以及Stack Overflow上的一些相关问题.

我已经多次使用这种模式/习语而没有任何问题.由于我一直在使用Java 5,我首先想到的是这已经在Java 5内存模型中得到了纠正.然而文章说:

本文引用了Java 5.0之前的Java内存模型; 关于内存排序的陈述可能不再正确.然而,在新的内存模型下,双重检查的锁定习惯仍然被打破.

这是一个真正的问题,如果是这样,在什么条件下?

java singleton double-checked-locking

6
推荐指数
1
解决办法
9307
查看次数

如何重新启动Android模拟器并保留系统数据

关闭时,是否可以在Android模拟器上保留系统数据(而不是SD卡数据)?我的具体问题是我尝试将新的根证书导入到/system/etc/security/cacerts.bks文件中,但这需要重新启动,当我重新启动模拟器时,文件将恢复为原始状态.

android android-emulator

6
推荐指数
1
解决办法
3447
查看次数

Redis在几个hsets中递增几个字段

我有redis中的几个用户的数据,例如

hset - user111; field - dayssincelogin .....

我想定期为所有用户更新dayssincelogin,其中一种方法是

KEYS user*
HINCRBY ${key from above} dayssincelogin 1
Run Code Online (Sandbox Code Playgroud)

是否可以在一次通话中完成此操作?如果不是最佳方式是什么?我正在使用redis集群和java客户端.

redis jedis

1
推荐指数
1
解决办法
823
查看次数