2012-01-30 15 views
17

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

मैं कैसे तय करूं कि मुझे synchronized का उपयोग कब करना चाहिए और जब मुझे पुनः प्रवेश करने वाले ताले का उपयोग करना चाहिए?

उत्तर

0

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

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

+0

केवल यदि आप एक सुलभ विधि के लिए 'synchronized' संशोधक लागू होते हैं, नहीं करता है, तो आप एक दुर्गम ताला वस्तु पर एक' synchronized' ब्लॉक का उपयोग करें "किसी भी ग्राहक को प्रभावी ढंग से अपने वस्तु की समन्वयन ताला के लिए सीधी पहुँच है।" – Raedwald

+0

हाँ। कि मैं क्या कहा। यदि आप अपने तरीकों पर डिफ़ॉल्ट सिंक्रनाइज़ किए गए कीवर्ड का उपयोग करते हैं, तो आप प्रभावी रूप से अपने ताले प्रकाशित कर रहे हैं। इसके चारों ओर जाने के लिए, सिंक्रनाइज़ ब्लॉक आंतरिक बनाओ। –

21

एक ReentrantLock है:

एक ही मूल व्यवहार और अंतर्निहित मॉनिटर ताला सिंक्रनाइज़ तरीकों और बयानों का उपयोग करके पहुँचा, लेकिन विस्तारित क्षमताओं के साथ के रूप में अर्थ विज्ञान के साथ एक रैत्रांत पारस्परिक अपवर्जन ताला।

विस्तारित क्षमताओं में शामिल हैं:

  1. एक से अधिक condition variable पर नजर रखने के प्रति किए जाने की क्षमता। सिंक्रनाइज़ किए गए कीवर्ड का उपयोग करने वाले मॉनीटर में केवल एक ही हो सकता है। इसका मतलब है कि पुनर्वित्त ताले एक से अधिक प्रतीक्षा()/सूचित() कतार का समर्थन करते हैं।
  2. लॉक fair बनाने की क्षमता। सिंक्रनाइज़ ब्लॉक अनुचित हैं।

    "[निष्पक्ष] लॉक सबसे लंबे समय तक प्रतीक्षा धागे तक पहुंच प्रदान करने के पक्ष में हैं। अन्यथा यह ताला किसी भी विशेष पहुंच आदेश की गारंटी नहीं देता है।"

  3. लॉक होने पर जांचने की क्षमता।
  4. धागे ताला पर इंतजार की सूची प्राप्त करने की क्षमता।

रैत्रांत ताले का नुकसान कर रहे हैं:

  1. इंपोर्ट स्टेटमेंट को जोड़ना होगा।
  2. कोशिश/अंत में ब्लॉक में लॉक अधिग्रहण लपेटने की आवश्यकता है। यह सिंक्रनाइज़ किए गए कीवर्ड से अधिक बदसूरत बनाता है।
  3. synchronized कीवर्ड विधि परिभाषाएँ जो एक ब्लॉक जो घोंसले कम कर देता है के लिए की जरूरत से बचा जाता है में रखा जा सकता।

सारांश

synchronized कीवर्ड वाक्य रचना अच्छे है, लेकिन रैत्रांत ताला अधिक सुविधाएं हैं।

0

इस साइट में स्पष्ट रूप से ReentrantLock के बीच अंतर का उल्लेख किया और जावा में कीवर्ड सिंक्रनाइज़। मैं बस वहां से कॉपी और पेस्ट करता हूं।

http://javarevisited.blogspot.in/2013/03/reentrantlock-example-in-java-synchronized-difference-vs-lock.html

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

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

3) जावा में ReentrantLock और सिंक्रनाइज़ किए गए कीवर्ड के बीच एक और मूल्यवान अंतर अंतर है, लॉक की प्रतीक्षा करते समय थ्रेड को बाधित करने की क्षमता है। सिंक्रनाइज़ किए गए कीवर्ड के मामले में, एक थ्रेड को लॉक के लिए इंतजार कर अवरुद्ध किया जा सकता है, अनिश्चित अवधि के लिए और उस पर नियंत्रण करने का कोई तरीका नहीं था। ReentrantLock एक विधि lockInterruptibly() कहा जाता है, जो जब यह ताला के लिए इंतज़ार कर रहा है धागा बाधित करने के लिए इस्तेमाल किया जा सकता प्रदान करता है। इसी प्रकार टाइमआउट के साथ tryLock() को समय-समय पर उपयोग किया जा सकता है यदि कुछ समय अवधि में लॉक उपलब्ध नहीं है।

4) पुनर्विक्रेता लॉक लॉक के लिए प्रतीक्षा किए गए सभी थ्रेडों की सूची प्राप्त करने के लिए सुविधाजनक तरीका भी प्रदान करता है।

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