मेरे साक्षात्कार के दौरान, साक्षात्कारकर्ता ने सिंगलटन पैटर्न के साथ अपना प्रश्न शुरू किया। मैंने नीचे लिखा था। फिर, उसने से पूछा कि क्या हमें getInstance
विधि के अंदर नलिटी की जांच नहीं करनी चाहिए?मल्टी थ्रेडेड वातावरण में सिंगलटन पैटर्न
मैंने जवाब दिया, यह आवश्यक नहीं है, क्योंकि सदस्य स्थिर प्रकार है और उसी समय आरंभ किया जा रहा है। लेकिन, ऐसा लगता है कि वह मेरे जवाब से संतुष्ट नहीं था। क्या मैं सही हूं या नहीं?
class Single {
private final static Single sing = new Single();
private Single() {
}
public static Single getInstance() {
return sing;
}
}
अब, अगला प्रश्न वह बहु-थ्रेडेड वातावरण के लिए सिंगलटन कक्षा लिखने के लिए कहता है। फिर, मैंने डबल चेक सिंगलटन कक्षा लिखी।
class MultithreadedSingle {
private static MultithreadedSingle single;
private MultithreadedSingle() {
}
public static MultithreadedSingle getInstance() {
if(single==null){
synchronized(MultithreadedSingle.class){
if(single==null){
single= new MultithreadedSingle();
}
}
}
return single;
}
}
फिर, वह synchronized
और पुनः जाँच का उपयोग कर के समक्ष आपत्ति की थी और कहा यह बेकार है। आप दो बार क्यों जांच रहे हैं और आप सिंक्रनाइज़ क्यों कर रहे हैं? मैंने उसे कई परिदृश्यों से मनाने की कोशिश की। लेकिन, उसने नहीं किया।
बाद में, घर पर मैंने कोड के नीचे कोशिश की जहां मैं एकाधिक थ्रेड के साथ सरल सिंगलटन कक्षा का उपयोग कर रहा हूं।
Thread-0 : 1153093538
Thread-0 : 1153093538
Thread-0 : 1153093538
Thread-0 : 1153093538
Thread-0 : 1153093538
Thread-4 : 1153093538
Thread-1 : 1153093538
Thread-2 : 1153093538
Thread-3 : 1153093538
Thread-3 : 1153093538
Thread-3 : 1153093538
Thread-3 : 1153093538
Thread-3 : 1153093538
Thread-2 : 1153093538
Thread-2 : 1153093538
Thread-2 : 1153093538
Thread-2 : 1153093538
Thread-1 : 1153093538
Thread-1 : 1153093538
Thread-1 : 1153093538
Thread-1 : 1153093538
Thread-4 : 1153093538
Thread-4 : 1153093538
Thread-4 : 1153093538
Thread-4 : 1153093538
तो, सवाल है, यह आवश्यक या/और में दोहरी जांच विधि मल्टी-थ्रेडेड वातावरण synchronize
उपयोग करने के लिए है:
public class Test {
public static void main(String ar[]) {
Test1 t = new Test1();
Test1 t2 = new Test1();
Test1 t3 = new Test1();
Thread tt = new Thread(t);
Thread tt2 = new Thread(t2);
Thread tt3 = new Thread(t3);
Thread tt4 = new Thread(t);
Thread tt5 = new Thread(t);
tt.start();
tt2.start();
tt3.start();
tt4.start();
tt5.start();
}
}
final class Test1 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " : " + Single.getInstance().hashCode());
}
}
}
class Single {
private final static Single sing = new Single();
private Single() {
}
public static Single getInstance() {
return sing;
}
}
नीचे उत्पादन है? यह मेरे पहले कोड की तरह लगता है (कोड की कोई अतिरिक्त लाइन जोड़ने के बिना) दोनों प्रश्नों का उत्तर था। किसी भी सुधार और ज्ञान शेयर की सराहना की जाएगी।
केवल आपत्ति मैं पहली बार उदाहरण के लिए है छोटे अक्षर "एस" कक्षा में "एकल है का उपयोग करते हुए ";) मुझे कोई दौड़ की स्थिति नहीं दिख रही है। या तो कक्षा में, या किसी भी संभावित ग्राहक में जो "सिंगल.getInstance()", – paulsm4
@ paulsm4 को कॉल कर सकता है, सभी को सही कर सकता है;) यदि आप अभी भी किसी भी चूक गए हैं, तो आप संपादित कर सकते हैं :) – Ravi
कोई "सुधार" वास्तव में आवश्यक नहीं है: लेकिन " ऊपरी मामला "निश्चित रूप से अच्छी शैली है। आपके प्रश्न के अनुसार: मैं पूरी तरह से यशावित और इव्गेनी डोरोफिव के साथ सहमत हूं। कृपया दोनों को ऊपर उठाने के लिए स्वतंत्र महसूस करें। और यदि आप भी सहमत हैं तो "स्वीकार करें"। – paulsm4