2011-11-17 36 views
20

मैं जावा बहु सूत्रण सीख रहा हूँ काम करता है दिखाने के लिए, मैंने पाया है कि यह कैसे सिंक्रनाइज़ ब्लॉक काम करता है समझने के लिए मुश्किल है:उदाहरण कोड कैसे जावा सिंक्रनाइज़ ब्लॉक

synchronized(Object o){ 
    // do something 
    } 

कृपया कुछ उदाहरण कोड है कि मुझे वस्तु ओ दिखा सकते हैं देना बंद किया गया है। जैसा कि मैं इसे समझता हूं, किसी अन्य थ्रेड से ऑब्जेक्ट ओ तक पहुंच को अवरुद्ध कर दिया जाएगा जबकि सिंक्रनाइज़ किए गए ब्लॉक को उत्तेजित किया जा रहा है?

+0

क्या आपने Google को आजमाया था? –

उत्तर

10

जावा में सिंक्रनाइज़ेशन एक महत्वपूर्ण अवधारणा है क्योंकि जावा एक बहु-थ्रेडेड भाषा है जहां एकाधिक थ्रेड प्रोग्राम निष्पादन को पूरा करने के समानांतर में चलते हैं। जावा ऑब्जेक्ट के बहु-थ्रेडेड वातावरण सिंक्रनाइज़ेशन या जावा क्लास के सिंक्रनाइज़ेशन में अत्यंत महत्वपूर्ण हो जाता है। जावा कीवर्ड "सिंक्रनाइज़" और "अस्थिर" का उपयोग करके जावा में सिंक्रनाइज़ेशन संभव है। जावा में साझा वस्तुओं की समवर्ती पहुंच में त्रुटियों की तरह परिचय होता है: थ्रेड हस्तक्षेप और स्मृति स्थिरता त्रुटियां और इन त्रुटियों से बचने के लिए आपको अपनी जावा ऑब्जेक्ट को ठीक से सिंक्रनाइज़ करने की आवश्यकता है । दो धागे के लिए महत्वपूर्ण खंड के आपसी अनन्य उपयोग की अनुमति

और अधिक पढ़ें: http://javarevisited.blogspot.com/2011/04/synchronization-in-java-synchronized.html#ixzz2LOWwnCjH

कृपया को देखो इस Example

10

सिंक्रनाइज़ कीवर्ड स्थिर/गैर स्थिर तरीकों या के एक ब्लॉक के लिए आवेदन किया जा सकता है कोड केवल एक धागा एक समय में सिंक्रनाइज़ किए गए तरीकों तक पहुंच सकते हैं और यदि एक ही विधि तक पहुंचने का प्रयास करने वाले एकाधिक थ्रेड हैं तो अन्य थ्रेड को एक थ्रेड द्वारा विधि के निष्पादन के लिए प्रतीक्षा करनी होगी। सिंक्रनाइज़ कीवर्ड वस्तु पर एक ताला प्रदान करता है और इस प्रकार रेस स्थिति

सरल उदाहरण से बचाता है:
सिंक्रनाइज़ ब्लॉक चुन सकते हैं जो वस्तु उस पर सिंक्रनाइज़ करता है:

public void synchronized method(){} 
public void synchronized staticmethod(){} 
public void myMethod(){ 

      synchronized (this){    // synchronized keyword on block of code 
      } 

} 

अधिक सिंक्रनाइज़ ब्लॉक और विधि के बारे में स्पष्टीकरण। एक सिंक्रनाइज़ विधि केवल 'इस' (या सिंक्रनाइज़ क्लास विधि के लिए संबंधित क्लास इंस्टेंस) का उपयोग कर सकती है। उदाहरण के लिए, इन शब्दार्थ बराबर हैं:

synchronized void foo() { 
    ... 
} 

void foo() { 
    synchronized (this) { 
     ... 
    } 
} 

बाद और अधिक लचीला है, क्योंकि यह किसी भी वस्तु के जुड़े ताला, अक्सर एक सदस्य चर के लिए प्रतिस्पर्धा कर सकते हैं। यह भी अधिक दानेदार है क्योंकि आप ब्लॉक के पहले और बाद में समवर्ती कोड निष्पादित कर सकते हैं लेकिन अभी भी विधि के भीतर। बेशक, आप अलग-अलग गैर-सिंक्रनाइज़ विधियों में समवर्ती कोड को पुन: सक्रिय करके सिंक्रनाइज़ विधि का आसानी से उपयोग कर सकते हैं। जो भी कोड अधिक समझदार बनाता है उसका प्रयोग करें।

0

सिंक्रनाइज़ेशन का वर्णन करता है कि यदि किसी ऑब्जेक्ट या ब्लॉक को सिंक्रनाइज़ के रूप में घोषित किया जाता है तो केवल एक ही प्रक्रिया उस ऑब्जेक्ट या ब्लॉक को किसी समय तक एक्सेस कर सकती है। कोई अन्य प्रक्रिया ऑब्जेक्ट या ब्लॉक को तब तक नहीं ले सकती जब तक यह उपलब्ध न हो। वैकल्पिक रूप से प्रत्येक ऑब्जेक्ट में एक होता है "लॉक" नामक ध्वज में दो राज्य सेट और रीसेट हैं। जब कोई प्रक्रिया एक ऑब्जेक्ट का अनुरोध करती है तो यह जांच की जाती है कि लॉक मान सेट या रीसेट हो गया है या नहीं। उस वस्तु के आधार पर सिंक्रनाइज़ेशन में प्रक्रिया के लिए उपलब्ध है। उदाहरण के साथ बेहतर समझने के लिए आप यह लिंक देख सकते हैं। enter link description here

+0

हालांकि यह सवाल का जवाब दे सकता है, सवाल पहले से ही उत्तर दिया गया है। कृपया बताएं कि आपका उत्तर अलग-अलग कैसे है (और) पहले से ही (और स्वीकृत) - या यह उन्हें कैसे बढ़ाता है। –

0

चूंकि अधिकांश उत्तरों में सिंक्रनाइज़ किया गया है, जिसका मतलब है कि मैं एक अतिरिक्त बिंदु जोड़ना चाहता हूं जिसका उल्लेख नहीं किया गया है। एक विधि को सिंक्रनाइज़ करने या सिंक्रनाइज़ किए गए ब्लॉक को संलग्न करने से यह सुनिश्चित होता है कि ऑपरेशन/संचालन का सेट एक परमाणु ऑपरेशन के रूप में निष्पादित होता है, जब एक थ्रेड किसी ऑब्जेक्ट पर सिंक्रनाइज़ करने वाले ब्लॉक को निष्पादित करता है तो कोई अन्य धागा ब्लॉक में प्रवेश नहीं कर सकता है जब तक कि थ्रेड पूरा नहीं हो जाता इसका निष्पादन और उस लॉक को रिलीज़ करता है जो ब्लॉक में प्रवेश करते समय इसे प्राप्त करता है।

तो कोड कथन के गुच्छा की परमाणुता सुनिश्चित करने के लिए ब्लॉक सिंक्रनाइज़ करें।

जो @lucifier निर्दिष्ट है, सिंक्रनाइज़िंग और अस्थिरता के विपरीत एक ही उद्देश्य की सेवा नहीं करता है, अस्थिरता यह सुनिश्चित करने के लिए है कि दो धागे एक दूसरे के साथ संवाद करें और व्यक्तिगत स्मृति से मूल्य प्राप्त करने के बजाय मुख्य स्मृति से सबसे अद्यतन मूल्य प्राप्त करें cache.it निष्पादन के लिए व्यवहार से पहले "पहले होता है" सुनिश्चित करता है।

उदाहरण के लिए एक वैरिएबल को परिभाषित करना अस्थिर (अस्थिर int i = 10;) एक असंतुलित विधि में एक वृद्धि कार्य (i ++;) निष्पादित करता है जब एक (i ++) सिंक्रनाइज़ किए गए ब्लॉक में संलग्न होता है।

1

आंतरिक ताले और तुल्यकालन

तुल्यकालन एक आंतरिक आंतरिक ताला रूप में जाना जाता इकाई के आसपास बनाया गया या लॉक की निगरानी कर रहा है। (एपीआई विनिर्देश अक्सर इस इकाई को "मॉनिटर" के रूप में संदर्भित करता है।) आंतरिक ताले सिंक्रनाइज़ेशन के दोनों पहलुओं में एक भूमिका निभाते हैं: किसी ऑब्जेक्ट के राज्य में विशेष पहुंच लागू करना और दृश्यता से पहले संबंधों को स्थापित करना।

प्रत्येक ऑब्जेक्ट में इसके साथ एक आंतरिक लॉक होता है। सम्मेलन के अनुसार, किसी थ्रेड को किसी ऑब्जेक्ट के फ़ील्ड में अनन्य और लगातार पहुंच की आवश्यकता होती है, उसे एक्सेस करने से पहले ऑब्जेक्ट के आंतरिक लॉक को प्राप्त करना होता है, और उसके बाद आंतरिक लॉक को तब जारी किया जाता है जब यह उनके साथ किया जाता है। एक धागा को लॉक हासिल करने के दौरान आंतरिक लॉक के मालिक होने के लिए कहा जाता है और लॉक जारी किया जाता है। जब तक एक थ्रेड एक आंतरिक लॉक का मालिक होता है, तब तक कोई अन्य धागा एक ही लॉक प्राप्त नहीं कर सकता है। जब यह ताला हासिल करने का प्रयास करता है तो दूसरा धागा अवरुद्ध होगा।

जब कोई थ्रेड एक आंतरिक लॉक जारी करता है, तो उस क्रिया के बीच एक पूर्व-संबंध संबंध स्थापित होता है और उसी लॉक के बाद के अधिग्रहण के बाद होता है।

ताले समन्वयित तरीके में

एक धागा एक तुल्यकालन विधि का आह्वान करते हैं, तो यह अपने आप उस विधि के वस्तु और विज्ञप्ति यह जब विधि रिटर्न के लिए आंतरिक ताला प्राप्त कर लेता है। लॉक रिलीज तब भी होता है जब वापसी एक अपवाद अपवाद के कारण हुई थी।

आपको आश्चर्य हो सकता है कि एक स्थिर सिंक्रनाइज़ विधि कब लागू की जाती है, क्योंकि एक स्थिर विधि कक्षा से जुड़ी होती है, न कि ऑब्जेक्ट। इस मामले में, धागे कक्षा से जुड़े कक्षा वस्तु के लिए आंतरिक लॉक प्राप्त करता है। इस प्रकार कक्षा के स्थैतिक क्षेत्रों तक पहुंच को लॉक द्वारा नियंत्रित किया जाता है जो कक्षा के किसी भी उदाहरण के लिए लॉक से अलग होता है।

संबंधित मुद्दे