Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java xStream processAnnotations并发性_Java_Multithreading_Xstream - Fatal编程技术网

Java xStream processAnnotations并发性

Java xStream processAnnotations并发性,java,multithreading,xstream,Java,Multithreading,Xstream,实际上,我只需要一个XStream实例。所以我有以下几节课: public class XSteamTool{ private static XStream xStream = new XStream(); static{ xStream.ignoreUnknownElements(); xStream.registerConverter(new DateConverter(TimeZone.getDefault())); }

实际上,我只需要一个XStream实例。所以我有以下几节课:

public class XSteamTool{
    private static XStream xStream = new XStream();

    static{
        xStream.ignoreUnknownElements();
        xStream.registerConverter(new DateConverter(TimeZone.getDefault()));
    }

    public static String objToXml(Object obj){
        xStream.processAnnotations(obj.getClass());
        return xStream.toXML(obj);
    }

    public static <T> T xmlToObj(String xmlString, Class<T> clazz){
        xStream.processAnnotations(clazz);
        return(T)xStream.fromXML(xmlString);
    }
}
public类XSteamTool{
私有静态XStream XStream=new XStream();
静止的{
xStream.ignoreUnknowneElements();
registerConverter(新的日期转换器(TimeZone.getDefault());
}
公共静态字符串objToXml(objectobj){
processAnnotations(obj.getClass());
返回xStream.toXML(obj);
}
公共静态T xmlToObj(字符串xmlString,类clazz){
processAnnotations(clazz);
返回(T)xStream.fromXML(xmlString);
}
}
但这在多线程环境中会遇到一些问题。我发现官方文档中有一条注释:XStream在配置时不是线程安全的。不幸的是,注释正在定义配置中的更改,该更改现在在处理对象编组时应用
我尝试在处理注释之前进行同步,这看起来很好:

public static String objToXml(Object obj){
    synchronized (obj.getClass()) {
        xStream.processAnnotations(obj.getClass());             
    }
    return xStream.toXML(obj);
}

public static <T> T xmlToObj(String xmlString, Class<T> clazz){
    synchronized (clazz) {
        xStream.processAnnotations(clazz);              
    }
    return(T)xStream.fromXML(xmlString);
}
公共静态字符串objToXml(objectobj){
已同步(obj.getClass()){
processAnnotations(obj.getClass());
}
返回xStream.toXML(obj);
}
公共静态T xmlToObj(字符串xmlString,类clazz){
同步(clazz){
processAnnotations(clazz);
}
返回(T)xStream.fromXML(xmlString);
}

我想知道这个用法是否正确。非常感谢您的建议。

最后,我们决定通过共享xStream实例(只初始化xStream一次,并在多线程环境中重用它):


私有静态映射xstream的单例实现怎么样


可以找到一个快速的例子

谢谢。但这不仅仅是关于单身。
private static Map<Class<?>, XStream> xStreamMap = Collections.synchronizedMap(new HashMap<Class<?>, XStream>());

private static XStream getXStreamInstance(Class<?> clazz) {
    if (xStreamMap.containsKey(clazz)) {
        return xStreamMap.get(clazz);
    }
    synchronized (clazz) {
        if (xStreamMap.containsKey(clazz)) {
            return xStreamMap.get(clazz);
        }
        XStream xStream = new XStream(new XppDriver(new NoNameCoder()));
        xStream.ignoreUnknownElements();
        xStream.registerConverter(new DateConverter(TimeZone.getDefault()));
        xStream.processAnnotations(clazz);
        xStreamMap.put(clazz, xStream);
        return xStream;
    }
}