मेरा लेना दोनों के बीच कोई अंतर नहीं होगा, सिवाय इसके कि सिंच ब्लॉक को क्षेत्र में अधिक स्थानीयकृत किया जा सकता है और इसलिए लॉक कम समय का होगा ??
हां। तुम सही हो। synchronized
विधियों के विपरीत, सिंक्रनाइज़ किए गए बयानों को उस वस्तु को निर्दिष्ट करना होगा जो आंतरिक लॉक प्रदान करता है। जावा ट्यूटोरियल से
उदाहरण:
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
सिंक्रनाइज़ बयान भी सुक्ष्म तुल्यकालन के साथ संगामिति में सुधार के लिए उपयोगी होते हैं। आप नीचे उपयोग मामले के लिए एक ही ट्यूटोरियल पेज पर अच्छा उदाहरण पा सकते हैं।
मान लीजिए, उदाहरण के लिए, कक्षा MsLunch
में दो उदाहरण फ़ील्ड, सी 1 और सी 2 हैं, जिनका कभी भी उपयोग नहीं किया जाता है। इन फ़ील्ड के सभी अपडेट synchronized
होना चाहिए, लेकिन सी 1 के अपडेट के साथ सीएल के अपडेट को रोकने से रोकने का कोई कारण नहीं है - और अनावश्यक अवरोधन बनाकर ऐसा करने से समरूपता कम हो जाती है। सिंक्रनाइज़ किए गए तरीकों का उपयोग करने या अन्यथा इसके साथ जुड़े लॉक का उपयोग करने के बजाय, हम ताले प्रदान करने के लिए पूरी तरह से दो ऑब्जेक्ट्स बनाते हैं।
और एक स्थिर विधि पर लॉक के मामले में, लॉक क्या लिया जाता है? क्लास पर लॉक का अर्थ क्या है?
इस मामले में, थ्रेड कक्षा से जुड़े क्लास ऑब्जेक्ट के लिए आंतरिक लॉक प्राप्त करता है। इस प्रकार कक्षा के स्थैतिक क्षेत्रों तक पहुंच को लॉक द्वारा नियंत्रित किया जाता है जो कक्षा के किसी भी उदाहरण के लिए लॉक से अलग होता है।
जब आप के रूप में synchronized (गैर static
) एक विधि बनाने:
यह एक ही वस्तु पर synchronized
तरीकों में से दो आमंत्रण बिछा करने के लिए संभव नहीं है। जब एक थ्रेड किसी ऑब्जेक्ट के लिए एक सिंक्रनाइज़ विधि को निष्पादित कर रहा है, तो अन्य सभी थ्रेड जो ऑब्जेक्ट के साथ पहले थ्रेड किए जाने तक उसी ऑब्जेक्ट ब्लॉक (निष्पादन को निलंबित) के लिए सिंक्रनाइज़ किए गए तरीकों का आह्वान करते हैं।
यदि आप कर static synchronized
के रूप में एक विधि:
यह एक ही कक्षा के विभिन्न वस्तुओं पर static synchronized
तरीकों में से दो आमंत्रण बिछा करने के लिए संभव नहीं है। जब एक धागा कक्षा ए के किसी ऑब्जेक्ट के लिए static synchronized
विधि निष्पादित कर रहा है, तो अन्य सभी थ्रेड जो क्लास ए ब्लॉक (निष्पादन को निलंबित करते हैं) के किसी भी ऑब्जेक्ट पर static synchronized
विधियों का उपयोग करते हैं, जब तक कि पहला थ्रेड विधि निष्पादन के साथ नहीं किया जाता है।
आप इस एसई प्रश्न में तुल्यकालन के लिए बेहतर विकल्प खोजने:
Avoid synchronized(this) in Java?
@ कोशिश-पकड़ने के अंत में वह इस सवाल का डुप्लिकेट नहीं है; वह प्रश्न पूछता है कि क्या एक सिंक्रनाइज़ विधि केवल विधि, या संपूर्ण वस्तु के लिए विशेष पहुंच प्रदान करती है। –
@MarkRotteveel आप अलग-अलग खिताब के मामले में सही हैं। दूसरी तरफ, अन्य प्रश्नों के उत्तरों में अंतर भी शामिल हैं: सिंक्रनाइज़ किए गए सेक्शन को कुछ कथन (या नहीं) में स्कॉप करना और इसे लॉक करना है (या उस पर कोई नियंत्रण नहीं है) को नियंत्रित करना। –