【问题标题】:Java xStream processAnnotations concurrencyJava xStream processAnnotations 并发
【发布时间】:2014-12-22 13:27:01
【问题描述】:

实际上我只想要一个 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);
    }
}

但这在多线程环境中会遇到问题。我在官方文档中找到了注释:XStream 在配置时不是线程安全的。不幸的是,注释正在定义配置更改,现在在处理对象编组时应用该更改
我尝试在 processAnnotations 之前进行同步,这看起来不错:

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

我想知道使用是否正确。任何建议表示赞赏。

【问题讨论】:

    标签: java multithreading xstream


    【解决方案1】:

    最后我们决定通过Class共享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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      xstream 的单例实现怎么样?

      可以在here找到一个简单的例子!

      【讨论】:

      • 谢谢。但这不仅仅是关于单身人士。
      猜你喜欢
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2013-08-19
      • 2012-04-05
      • 1970-01-01
      • 2011-09-03
      • 2011-09-14
      相关资源
      最近更新 更多