Java xStream processAnnotations并发性
实际上,我只需要一个XStream实例。所以我有以下几节课: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())); }
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;
}
}