, "सिंक्रनाइज़" में अनुभव प्राप्त हुआ है के लिए और अधिक परिचित हो सकते हैं अर्थ विज्ञान ताला लगा प्रस्तावों बस वाक्यात्मक चीनी है।
वहाँ में संदर्भित लेखन किया जाना चाहिए प्रत्येक वस्तु से जुड़ा एक ताला है। जावा प्रोग्रामिंग भाषा को अलग लॉक करने और संचालन अनलॉक करने का तरीका प्रदान नहीं करती है; इसके बजाय, वे हैं जो उच्च स्तर संरचनाओं द्वारा निहित प्रदर्शन करते हैं जो हमेशा ऐसे परिचालनों को सही ढंग से जोड़ना चाहते हैं। (जावा आभासी मशीन है, तथापि, अलग monitorenter और monitorexit निर्देश है कि ताला को लागू करने और संचालन अनलॉक प्रदान करता है।)
सिंक्रनाइज़ बयान किसी ऑब्जेक्ट को संदर्भ गणना करता है; यह उस ऑब्जेक्ट पर लॉक ऑपरेशन निष्पादित करने का प्रयास करता है और आगे नहीं बढ़ता है जब तक लॉक ऑपरेशन सफलतापूर्वक पूरा नहीं हो जाता है। (ए ताला आपरेशन देरी हो सकती है क्योंकि ताले जब तक कुछ अन्य धागा एक या अधिक अनलॉक आपरेशनों। प्रदर्शन करने के लिए तैयार है भाग लेने से मुख्य स्मृति रोका जा सकता है के बारे में नियम) ताला आपरेशन के बाद की जा चुकी है, सिंक्रनाइज़ कथन का शरीर निष्पादित है। आम तौर पर, जावा प्रोग्रामिंग भाषा के लिए एक संकलक सुनिश्चित करता है कि ताला आपरेशन एक monitorenter अनुदेश द्वारा कार्यान्वित निष्पादित सिंक्रनाइज़ बयान के शरीर के निष्पादन से पहले अनलॉक एक monitorexit अनुदेश जब भी द्वारा कार्यान्वित आपरेशन के अनुरूप है सिंक्रनाइज़ कथन पूरा करता है, चाहे पूरा हो रहा है या अचानक है।
एक सिंक्रनाइज़ विधि स्वचालित रूप से लॉक ऑपरेशन करता है जब यह लागू होता है; उसके शरीर निष्पादित नहीं है जब तक ताला आपरेशन सफलतापूर्वक पूरा कर लिया गया है। विधि एक उदाहरण विधि है, तो यह ताला जो इसे लागू किया गया था के लिए उदाहरण के साथ जुड़े ताले (जो है, उद्देश्य यह है कि विधि का शरीर के निष्पादन के दौरान यह के रूप में जाना जाएगा)। अगर विधि स्थिर है, यह कक्षा उद्देश्य यह है कि वर्ग जिसमें विधि परिभाषित किया गया है का प्रतिनिधित्व करता है के साथ जुड़े ताला अवरोधित करता है। यदि विधि के शरीर का निष्पादन कभी भी पूरा होता है, या तो सामान्य रूप से या अचानक, अनलॉक ऑपरेशन स्वचालित रूप से उसी लॉक पर किया जाता है।
सर्वश्रेष्ठ अभ्यास है कि अगर एक चर कभी एक धागा और इस्तेमाल किया या किसी अन्य द्वारा आवंटित द्वारा आवंटित किया जा रहा है, तो सभी कि चर के लिए पहुँचता सिंक्रनाइज़ तरीकों या सिंक्रनाइज़ बयान में संलग्न किया जाना चाहिए।
हालांकि ताले के जावा प्रोग्रामिंग भाषा के लिए एक संकलक सामान्य रूप से की गारंटी देता है संरचित उपयोग (धारा 7.14, "तुल्यकालन" देखें), बात की कोई गारंटी है कि सभी कोड जावा आभासी मशीन इस आज्ञा का पालन करेंगे को प्रस्तुत है संपत्ति। जावा आभासी मशीन के क्रियान्वयन की अनुमति है लेकिन की आवश्यकता नहीं दोनों संरचित लॉकिंग की गारंटी के बाद दो नियमों के लागू करने के लिए।
टी एक धागा और एल एक ताला होना बनें। तब:
एक विधि मंगलाचरण के दौरान एल पर टी द्वारा किया जाता संख्या के बराबर की विधि मंगलाचरण के दौरान एल पर टी द्वारा किया आपरेशन अनलॉक करना होगा ताला आपरेशन की संख्या चाहे विधि मंगलाचरण पूरा करता सामान्य रूप से या अचानक।
एक विधि मंगलाचरण के दौरान किसी भी बिंदु पर अनलॉक के बाद से एल पर टी द्वारा किया जाता विधि मंगलाचरण के संचालन की संख्या विधि मंगलाचरण के बाद से एल पर टी द्वारा किया जाता ताला आपरेशन के संख्या से अधिक हो सकती है।
कम औपचारिक शब्दों में, एक विधि मंगलाचरण एल पर हर अनलॉक आपरेशन एल पर कुछ पूर्ववर्ती ताला आपरेशन से मेल खाना चाहिए
ध्यान दें कि ताला और स्वचालित रूप से अनलॉक जावा द्वारा किया जाता दौरान आभासी मशीन जब एक सिंक्रनाइज़ विधि लागू माना जाता है बुला विधि के मंगलाचरण दौरान होते हैं।
यह निश्चित रूप से नहीं है। क्या आप उन स्रोतों का हवाला दे सकते हैं जहां आपने यह सुना है? – BalusC
@ बालससी: स्वीकृत उत्तर देखें। मुझे लगता है कि स्रोत सिंक्रनाइज़ * विधियों * को सिंटैक्टिक चीनी के रूप में संदर्भित कर रहे थे - मुझे यकीन नहीं है कि यह बिल्कुल सही है या नहीं, लेकिन कम से कम यह मेरे निष्कर्षों के विपरीत नहीं है जैसा मैंने सोचा था। @ स्काफमैन: मैं जानता था कि मैं सिंक्रनाइज़ किए बिना 'सिंक्रनाइज़ किए गए' के बिना गलत कर रहा था :) – Cam
@ एक विधि पर @ अनुबंधित 'सिंक्रनाइज़', विधि के शरीर को सिंक्रनाइज़ (इस) में डालने जैसा ही कम है {...} '(या एक स्थैतिक विधि के लिए 'सिंक्रनाइज़ (MyClass.class) {...}')। (यह वर्ग फ़ाइलों में अलग-अलग प्रतिनिधित्व करता है, लेकिन यह आपको आमतौर पर चिंता नहीं करना चाहिए।) –