2011-08-24 15 views
9

मैं सिंगलटन सत्र सेम के बारे में पढ़ना शुरू किया है और कंटेनर को रोजगार के लिए इस्तेमाल किया एनोटेशन कामयाब संगामिति। मुझे बस 'सिंक्रनाइज़' कीवर्ड का उपयोग करने की तुलना में इसका लाभ नहीं दिख रहा है, इसलिए मुझे संदेह है कि कुछ महत्वपूर्ण है जो मुझे याद आ रही है। पुस्तक "Enterprise JavaBeans 3.1" Rubinger & बर्क द्वारा से इस उदाहरण पर विचार, ओ रेली:EJB 3.1 कंटेनर में कामयाब संगामिति बनाम सिंक्रनाइज़

@javax.ejb.Lock(javax.ejb.LockType.READ) 
public String concurrentReadOnlyMethod(){...} 

@javax.ejb.Lock(javax.ejb.LockType.WRITE) 
public void allowOnlyOneWriteAtATimeMethod(String stringToSet){...} 

कैसे पढ़ने के मामले में सभी toghether एनोटेशन को छोड़ते हुए और लिखने के मामले में synchronized कीवर्ड का उपयोग करने से यह बेहतर है , इस तरह:

public String concurrentReadOnlyMethod(){...} 

public synchronized void allowOnlyOneWriteAtATimeMethod(String stringToSet){...} 

उत्तर

4

सरल।

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

स्पष्ट रूप से अधिक मूल्य है जब आपके पास कई रीड लॉक और कुछ WRITE ताले हैं, क्योंकि सभी रीड लॉक को साझा और चलाया जा सकता है, जबकि WRITE लॉक सामान्य सिंक्रनाइज़ की तरह कार्य करते हैं।

+1

अगर मैं तुम्हें सही ढंग से समझ, हो सकता है मैं वाक्यांश यह अनौपचारिक रूप से इस तरह: कंटेनर में कामयाब संगामिति के साथ अर्थ विज्ञान है "समवर्ती पढ़ता है जब तक अनुमति दी जाती है के रूप में कोई लेखन चल रहा है" उपरोक्त विधियों में से दोनों युक्त एक वर्ग, को देखते हुए। विरोधाभासी उदाहरण के अर्थशास्त्र "समवर्ती पढ़ने की अनुमति है, लेखन के दौरान भी, लेकिन एक समय में केवल एक धागा लिखना होगा"। –

+0

हाँ, यह इसे बहुत अच्छी तरह से सारांशित करता है। –

+0

क्या आप मुझे ईजेबी 3.1 में रीड/राइट लॉक के इस अर्थशास्त्र का संदर्भ दे सकते हैं? मैं इसे विनिर्देशन में भी नहीं मिला। – illEatYourPuppies

2

ठीक है, के रूप में विल ने उल्लेख किया, synchronized साथ आप वास्तव में javax.ejb.Lock एनोटेशन के व्यवहार को दोहराने नहीं कर सकते, लेकिन आप इसे ReadWriteLock ताले का उपयोग करके वास्तव में क्या कर सकते हैं, लेकिन यह अंत में और अधिक काम है।

एक तरफ ध्यान दें के रूप में, के बाद से सिंगलटन उदाहरणों कई JVMs के बीच साझा नहीं कर रहे हैं (यानी वे वस्तुओं वितरित नहीं कर रहे हैं), वहाँ वास्तव में कोई अन्य लाभ मुझे लगता है कि Lock बारे में सोच सकते हैं एक तरफ उपयोग के रूप में आसानी प्रदान करता है और बॉक्स से बाहर समर्थन।

कृपया ध्यान दें कि "यह व्याख्या नहीं किया जाता है, तो लॉक (लिखें) के मान माना जाता है", तो आप वास्तव में या तो इसे से छुटकारा पाने के लिए नहीं कर सकते हैं।

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