我对此完全感到困惑。我正在运行全套的单元测试。这是一些JUnit测试使用的相关共享代码:

private static Map<String, JAXBContext> jaxbContexts =
                             new HashMap<String, JAXBContext>();

private synchronized JAXBContext getJAXBContext(Class clazz) throws JAXBException {
    JAXBContext context = null;
    if (jaxbContexts.containsKey(clazz.getName())) {
        context = jaxbContexts.get(clazz.getName());
    } else {
        context = JAXBContext.newInstance(clazz);
        System.out.println("Created new context for '" + clazz.getName() + "'");
        jaxbContexts.put(clazz.getName(), context);
    }
    return context;
}


JUnit运行的控制台输出包括以下两个连续的条目:

Created new context for 'com.somecompany.xmlschema.providepensionpaymentinfo.Interface'
Created new context for 'com.somecompany.xmlschema.providepensionpaymentinfo.Interface'


我想念什么?为什么在与JUnit执行不同的其他46次操作中,jaxbContexts.containsKey()在这种情况下不能用于基于字符串的键?我们不会并行运行测试,但是如果有区别,我们会使用Aspects。

最佳答案

对其进行调试,并验证包含此getJAXBContext()方法的类仅被实例化一次(通过在调试模式下对其进行的每次调用检查其是否具有相同的内存ID)。如果实例化不同,则synced关键字将锁定不同的锁,并且它们将使用不同的映射。

10-08 19:38