হ্যাঁ, এটি প্রয়োজনীয়। অলস সূচনা সহ থ্রেড সুরক্ষা অর্জন করতে আপনি বিভিন্ন পদ্ধতি ব্যবহার করতে পারেন:
ড্রাকোনিয়ান সিঙ্ক্রোনাইজেশন:
private static YourObject instance;
public static synchronized YourObject getInstance() {
if (instance == null) {
instance = new YourObject();
}
return instance;
}
এই সমাধানটির জন্য প্রতিটি থ্রেডকে সিঙ্ক্রোনাইজ করা প্রয়োজন যখন বাস্তবে কেবল প্রথম কয়েকটি হওয়া দরকার।
ডাবল চেক সিঙ্ক্রোনাইজেশন :
private static final Object lock = new Object();
private static volatile YourObject instance;
public static YourObject getInstance() {
YourObject r = instance;
if (r == null) {
synchronized (lock) { // While we were waiting for the lock, another
r = instance; // thread may have instantiated the object.
if (r == null) {
r = new YourObject();
instance = r;
}
}
}
return r;
}
এই সমাধানটি নিশ্চিত করে যে কেবলমাত্র প্রথম কয়েকটি থ্রেড যা আপনার সিঙ্গলটন অর্জন করার চেষ্টা করে তা লক অর্জনের প্রক্রিয়াটি পেরিয়ে যেতে হবে।
দাবিতে শুরু :
private static class InstanceHolder {
private static final YourObject instance = new YourObject();
}
public static YourObject getInstance() {
return InstanceHolder.instance;
}
এই সমাধানটি থ্রেড সুরক্ষা নিশ্চিত করতে শ্রেণি সূচনা সম্পর্কে জাভা মেমরি মডেলের গ্যারান্টিগুলির সুবিধা গ্রহণ করে। প্রতিটি ক্লাস কেবল একবার লোড করা যায় এবং এটি কেবল যখন প্রয়োজন হয় তখন লোড হবে। এর অর্থ getInstance
হ'ল প্রথমবার বলা হয়, InstanceHolder
লোড instance
হবে এবং তৈরি হবে এবং যেহেতু এটি ClassLoader
এস দ্বারা নিয়ন্ত্রিত হয় , তাই কোনও অতিরিক্ত সিঙ্ক্রোনাইজেশন প্রয়োজন হয় না।