আমি সাধারণত ThreadLocal
ক্লাসের ধরণ দিয়ে এ জাতীয় সমস্যাগুলি সমাধান করি । প্রতিটি ক্লাসের জন্য আপনার আলাদা মার্শালার দরকার রয়েছে তা প্রমাণ করে আপনি এটিকে একটি- singleton
ম্যাপ প্যাটার্নের সাথে একত্রিত করতে পারেন ।
কাজের জন্য আপনাকে 15 মিনিট বাঁচাতে। এখানে আমার Jaxb মার্শালার্স এবং আনমারশালারদের জন্য থ্রেড-সেফ কারখানার বাস্তবায়ন অনুসরণ করা হয়েছে।
এটি আপনাকে নীচে উদাহরণগুলি অ্যাক্সেস করার অনুমতি দেয় ...
Marshaller m = Jaxb.get(SomeClass.class).getMarshaller();
Unmarshaller um = Jaxb.get(SomeClass.class).getUnmarshaller();
এবং আপনার যে কোডটির প্রয়োজন হবে সেটি হল একটি সামান্য জ্যাক্সবি ক্লাস যা নীচের মত দেখাচ্ছে:
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;
}
}