जावा 8 में, मैं आसानी से लिख सकता हूं:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
मुझे पूर्ण सिंक्रनाइज़ेशन शब्दार्थ मिलेगा जो मैं कक्षाओं में भी उपयोग कर सकता हूं। हालाँकि, मैं synchronizedपद्धति घोषणाओं में संशोधन का उपयोग नहीं कर सकता :
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
अब, कोई यह तर्क दे सकता है कि दो इंटरफेस एक ही तरह से व्यवहार करते हैं सिवाय इसके कि Interface2एक अनुबंध पर method1()और उस पर स्थापित method2()होता है, जो कि क्या Interface1करता है की तुलना में थोड़ा मजबूत है। बेशक, हम यह भी तर्क दे सकते हैं कि defaultकार्यान्वयन को ठोस कार्यान्वयन राज्य के बारे में कोई धारणा नहीं बनाना चाहिए, या ऐसा कोई कीवर्ड केवल अपना वजन नहीं बढ़ाएगा।
सवाल:
क्या कारण है कि JSR-335 विशेषज्ञ समूह ने synchronizedइंटरफ़ेस विधियों पर समर्थन नहीं करने का निर्णय लिया ?
default synchronized, फिर भी इसके लिए जरूरी नहीं है static synchronized, हालांकि मैं स्वीकार करता हूं कि बाद वाले को निरंतरता कारणों से छोड़ दिया गया हो सकता है।
synchronizedउप-वर्ग में संशोधक को ओवरराइड किया जा सकता है, इसलिए यह केवल तभी महत्वपूर्ण होगा जब अंतिम डिफ़ॉल्ट विधियों के रूप में कुछ था। (आपका अन्य प्रश्न)
synchronizedसुपर क्लास में घोषित तरीकों को ओवरराइड कर सकते हैं , प्रभावी ढंग से सिंक्रनाइज़ेशन को हटा सकते हैं। मुझे आश्चर्य नहीं होगा कि समर्थन synchronizedऔर समर्थन नहीं finalकरना संबंधित है, हालांकि, शायद कई उत्तराधिकार (जैसे विरासत void x() और synchronized void x() , आदि) के कारण। लेकिन यह अटकलें हैं। मैं एक आधिकारिक कारण के बारे में उत्सुक हूं, अगर एक है।
superजिसके लिए पूर्ण पुन: कार्यान्वयन और निजी सदस्यों तक संभव पहुंच की आवश्यकता होती है। Btw, एक कारण है कि उन तरीकों को "रक्षक" कहा जाता है - वे नए तरीकों को जोड़ने की आसान अनुमति देने के लिए मौजूद हैं।