ฉันมักจะแก้ปัญหาเช่นนี้ด้วยThreadLocal
รูปแบบชั้นเรียน เนื่องจากคุณต้องการมาร์แชลsingleton
เลอร์ที่แตกต่างกันสำหรับแต่ละคลาสคุณสามารถรวมเข้ากับรูปแบบแผนที่
เพื่อช่วยคุณประหยัดเวลา 15 นาทีในการทำงาน ต่อไปนี้เป็นไปตามการใช้งานโรงงานที่ปลอดภัยต่อเธรดสำหรับ Jaxb Marshallers และ Unmarshallers
ช่วยให้คุณสามารถเข้าถึงอินสแตนซ์ดังต่อไปนี้ ...
Marshaller m = Jaxb.get(SomeClass.class).getMarshaller();
Unmarshaller um = Jaxb.get(SomeClass.class).getUnmarshaller();
และรหัสที่คุณจะต้องมีคือคลาส Jaxb เล็กน้อยที่มีลักษณะดังนี้:
public class Jaxb
{
// singleton pattern: one instance per class.
private static Map<Class,Jaxb> singletonMap = new HashMap<>();
private Class clazz;
// thread-local pattern: one marshaller/unmarshaller instance per thread
private ThreadLocal<Marshaller> marshallerThreadLocal = new ThreadLocal<>();
private ThreadLocal<Unmarshaller> unmarshallerThreadLocal = new ThreadLocal<>();
// The static singleton getter needs to be thread-safe too,
// so this method is marked as synchronized.
public static synchronized Jaxb get(Class clazz)
{
Jaxb jaxb = singletonMap.get(clazz);
if (jaxb == null)
{
jaxb = new Jaxb(clazz);
singletonMap.put(clazz, jaxb);
}
return jaxb;
}
// the constructor needs to be private,
// because all instances need to be created with the get method.
private Jaxb(Class clazz)
{
this.clazz = clazz;
}
/**
* Gets/Creates a marshaller (thread-safe)
* @throws JAXBException
*/
public Marshaller getMarshaller() throws JAXBException
{
Marshaller m = marshallerThreadLocal.get();
if (m == null)
{
JAXBContext jc = JAXBContext.newInstance(clazz);
m = jc.createMarshaller();
marshallerThreadLocal.set(m);
}
return m;
}
/**
* Gets/Creates an unmarshaller (thread-safe)
* @throws JAXBException
*/
public Unmarshaller getUnmarshaller() throws JAXBException
{
Unmarshaller um = unmarshallerThreadLocal.get();
if (um == null)
{
JAXBContext jc = JAXBContext.newInstance(clazz);
um = jc.createUnmarshaller();
unmarshallerThreadLocal.set(um);
}
return um;
}
}