मैं अपने पास रजिस्ट्री में कुछ नियंत्रकों को प्रारंभ करने के लिए एक स्थिर कोड ब्लॉक का उपयोग कर रहा हूं। मेरा सवाल इसलिए है, क्या मैं गारंटी दे सकता हूं कि कक्षा को पहली बार लोड होने पर यह स्थैतिक कोड ब्लॉक केवल एक बार बुलाया जाएगा? मैं समझता हूं कि जब मैं इस कोड ब्लॉक को कॉल करता हूं तो मैं गारंटी नहीं दे सकता, मैं इसका अनुमान लगा रहा हूं जब क्लासलोडर पहले इसे लोड करता है। मुझे एहसास है कि मैं स्थिर कोड ब्लॉक में कक्षा पर सिंक्रनाइज़ कर सकता हूं, लेकिन मेरा अनुमान है कि वास्तव में यह वास्तव में क्या होता है?जावा स्थैतिक प्रारंभकर्ता धागे सुरक्षित हैं?
सरल कोड उदाहरण होगा;
class FooRegistry {
static {
//this code must only ever be called once
addController(new FooControllerImpl());
}
private static void addController(IFooController controller) {
// ...
}
}
या मुझे यह करना चाहिए;
class FooRegistry {
static {
synchronized(FooRegistry.class) {
addController(new FooControllerImpl());
}
}
private static void addController(IFooController controller) {
// ...
}
}
मुझे यह डिज़ाइन पसंद नहीं है, क्योंकि यह अवांछित है। निर्भरता इंजेक्शन पर एक नज़र डालें। – dfa