2015-06-12 9 views
5

मैं एक धागा सुरक्षित वर्ग कंटेनर के साथ स्पष्ट ताले गठबंधन प्रत्येक पुनरावृत्ति पर कंटेनर का ताला और केवल लूप के अंत में, सभी ताले छोड़ दें। कुछ इस तरह:जावा सिंक्रनाइज़ तरीकों

for(Container c : containers) { 
    c.lock(); 
    //do stuff 
} 
for(Container c : containers) 
    c.unlock(); 

मैं अभी भी अन्य थ्रेड खुला कंटेनरों के getX और setX तरीकों का उपयोग करने के लिए जारी रखने के लिए सक्षम होना चाहते हैं, लेकिन विभिन्न कारणों से मैं पहले से ही विश्लेषण किया कंटेनरों के लिए अनुमति देने के लिए है कि नहीं करना चाहती के लिए।

क्या आप इसके लिए जावा कोड जानते हैं?

बेहतर विचारों की भी सराहना की जाती है।

+0

कैसे 'ताला()' और 'अनलॉक होने के बारे में()' 'getX' और' setX' में पहली और आखिरी? – aioobe

+0

@see [ReentrantLock] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html) –

+0

@aioobe: मैं सिंक्रनाइज़ किए गए तरीकों को स्पष्ट रूप से जोड़ना चाहता हूं ताले (उम्मीद है कि यह possibile है, लेकिन मुझे लगता है कि यह इसलिए है क्योंकि दृश्यों के पीछे सिंक्रनाइज़ किए गए कीवर्ड ऑब्जेक्ट लॉक प्राप्त करता है)। – Kami

उत्तर

1

यह संभव नहीं है कि मुझे डर है। जावा भाषा synchronized (...) { ... } ब्लॉक (और सिंक्रनाइज़ विधियों) के साथ सख्त घोंसले सिद्धांत को लागू करती है।

कहा जा रहा है कि, वहां खराब कामकाज हैं। बाइटकोड एक सिंक्रनाइज़ ब्लॉक दो अलग monitorenter/monitorexit निर्देशों में अनुवाद करता है। sun.mis.Unsafe.monitorEnter() और monitorExit() के साथ एक ही चीज़ हासिल की जा सकती है।

हालांकि, इस मामले में, मैं आपको डिजाइन पर पुनर्विचार करने के लिए दृढ़ता से प्रोत्साहित करता हूं। मैं सुझाव दूंगा कि आप getX और setX को आंतरिक Lock (जो ट्रैवर्सल विधि भी उपयोग करता है) प्राप्त/रिलीज़ करें। विशेष रूप से, आप का उपयोग अपने setX और getX विधियों के लिए कर सकते हैं। वास्तव में, यह दृष्टिकोण synchronized अन्य कारणों से भी बेहतर है। उदाहरण के लिए देखें:

Why is it a good practice to have separate locks instead of having lock on object that get modified in the synchronized block in java?

+0

क्या सिंक्रनाइज़ किए गए कीवर्ड ऑब्जेक्ट के लॉक को ही प्राप्त नहीं करते हैं? यह विधि के अंदर सिंक्रनाइज़ (यह) {} लिखने जैसा है। अगर हम इस पर लॉक कर रहे हैं, तो हम ऑब्जेक्ट को लॉक करने वाले लॉक क्यों नहीं बना सकते? – Kami

+0

एक आंतरिक ताला के साथ, क्या मुझे एक ही समस्या नहीं होगी? सिंक्रनाइज़ किए गए कीवर्ड का उपयोग किये बिना मैं एकाधिक आंतरिक ताले (प्रत्येक पुनरावृत्ति पर एक) कैसे प्राप्त कर सकता हूं? – Kami

+0

आपकी समझ सही है। एकमात्र कारण हम केवल 'लॉक (यह);' और फिर बाद में 'अनलॉक (यह);' (जो उद्घाटन ब्रेस '{' resp।सिंक्रनाइज़ (यह) 'का' बंद 'ब्रेस '}' यह है कि इस प्रकार के लॉक को हासिल करने का एकमात्र तरीका सिंक्रनाइज़ किए गए कीवर्ड के माध्यम से है (जब तक कि आप मेरे उत्तर में उल्लिखित असुरक्षित संचालन का सहारा लेते हैं) और सिंक्रनाइज़ किए गए कीवर्ड में '{...}' ब्लॉक की वाक्य रचनात्मक बाधा। – aioobe

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