在同一个jvm中碰撞两个应用程序的静态变量

时间:2013-07-17 15:44:37

标签: java static applet jvm singleton

我有一个applet应用程序,它使用了几个静态对象(我们无法摆脱它们)。该应用程序从html页面启动。浏览器为任意数量的选项卡创建单个jvm,因此如果您使用此应用程序打开两个选项卡,静态变量将与它们共享。在此之后两者都无法正常工作。我们尝试使用separate_jvm,但它并不适用于所有浏览器。

还有其他解决方案吗?

1 个答案:

答案 0 :(得分:2)

此测试用例演示了在类加载器的两个实例中加载类时,单个类中的静态字段如何在同一个JVM中具有不同的值:

@Test
public void test() throws Exception {

    MyLoader customLoader1 = new MyLoader();
    MyLoader customLoader2 = new MyLoader();

    Class<?> c1 = customLoader1.loadClass(SPECIAL_CLASS_NAME);
    Class<?> c2 = customLoader2.loadClass(SPECIAL_CLASS_NAME);

    LoadedClass o1 = (LoadedClass) c1.newInstance();
    LoadedClass o2 = (LoadedClass) c2.newInstance();

    o1.setStaticPart(100d);
    o2.setStaticPart(1d);

    assertEquals(100d, o1.getStaticPart());
    assertEquals(1d, o2.getStaticPart());
}

如何在applet中使用自定义类加载器作为练习给读者留下。 : - )