ডাবল-চেকড লকিং। মোটের উপর.
আমি বিআইএতে কাজ করার সময় যে সমস্যাগুলি শিখতে শুরু করেছি, সেই দৃষ্টান্তটি হ'ল লোকেরা নিম্নলিখিত পদ্ধতিতে একটি সিঙ্গলটন পরীক্ষা করবে:
public Class MySingleton {
private static MySingleton s_instance;
public static MySingleton getInstance() {
if(s_instance == null) {
synchronized(MySingleton.class) { s_instance = new MySingleton(); }
}
return s_instance;
}
}
এটি কখনই কাজ করে না, কারণ অন্য থ্রেডটি সম্ভবত সিঙ্ক্রোনাইজড ব্লকে প্রবেশ করেছে এবং s_instance আর নাল নয়। তাই প্রাকৃতিক পরিবর্তনই এটি করা:
public static MySingleton getInstance() {
if(s_instance == null) {
synchronized(MySingleton.class) {
if(s_instance == null) s_instance = new MySingleton();
}
}
return s_instance;
}
এটি কোনওভাবেই কাজ করে না, কারণ জাভা মেমরি মডেল এটি সমর্থন করে না। এটিকে কাজ করতে আপনাকে s_instance কে অস্থির হিসাবে ঘোষণা করতে হবে এবং তারপরেও এটি কেবল জাভা 5 এ কাজ করে।
জনগণ জাভা মেমরি মডেল আপ জগাখিচুড়ি এই এর intricacies সাথে পরিচিত না হন সর্বকালের ।