तो, अद्यतन के साथ दोनों विकल्प थ्रेड-सुरक्षित हैं। हालांकि synchronized
विकल्प को प्रत्येक थ्रेड की आवश्यकता होती है जो इस लॉक को प्राप्त करने के लिए instance
पर कॉल करता है जिससे प्रदर्शन कम हो जाता है यदि यह बहुत कुछ किया जाता है। इसके अलावा, विधि स्तर पर synchronized
का उपयोग सार्वजनिक रूप से उपलब्ध लॉक (कक्षा स्वयं) का उपयोग करने का संभावित मुद्दा है, इसलिए यदि कुछ थ्रेड इस लॉक को प्राप्त करता है (जो यह हो सकता है) तो आप डेडलॉक के साथ समाप्त हो सकते हैं। static final
विकल्प अधिक प्रदर्शन करने वाला है लेकिन सिंगलटन का आलसी प्रारंभ नहीं करता है (जो सिस्टम के आधार पर कोई समस्या नहीं हो सकती है)।
एक अन्य विकल्प है कि धागे की सुरक्षित सिंगलटन की init आलसी की अनुमति देता है इस प्रकार है:
public class MySingleton{
private static class Builder{
private static final MySingleton instance = new MySingleton();
}
public static MySingleton instance(){
return Builder.intance;
}
}
यह काम करता है क्योंकि स्थिर भीतरी कक्षा से पहले युक्त कक्षा में किसी भी विधि के निष्पादित होने प्रारंभ करने के लिए guarenteed है। जावा में
स्रोत
2012-12-05 13:26:52
आपके अपडेट किए गए प्रश्न के बाद कोई अंतर नहीं। –
यह सवाल सिंगलटन के साथ कुछ भी नहीं है। आप सिंक्रनाइज़/गैर-सिंक्रनाइज़ संदर्भ से स्थिर फ़ील्ड तक पहुंचने के बारे में पूछते हैं। कृपया टैग संपादित करें। – Juvanis
@ भविक अंबानी मैं असहमत हूं क्योंकि पहला विकल्प प्रत्येक थ्रेड को लॉक करेगा जो उदाहरण प्राप्त करने का प्रयास करता है और इसलिए थोड़ा कम प्रदर्शन करता है। –