2010-07-22 12 views
11

दोस्तों, किसी को भी LockSupport & AbstractQueuedSynchronizer उपयोग की एक सरल व्यावहारिक उदाहरण दे सकते हैं? javadocs में दिया गया उदाहरण काफी तनावग्रस्त है।LockSupport और AbstractQueuedSynchronizer का कोई व्यावहारिक उदाहरण उपयोग करते हैं?

Semaphore परमिट का उपयोग मेरे द्वारा समझा जाता है।

किसी भी प्रतिक्रिया के लिए धन्यवाद।

उत्तर

13

यदि आप लॉकिंग तंत्र (या बाधाओं को सिंक भी करते हैं) का उपयोग करने के बारे में बात कर रहे हैं तो बस java.util.concurrent.Lock का उपयोग करें। स्पष्ट सुझाव उपयोगकर्ता को ReentrantLock है जो Synch पर प्रतिनिधि करता है। सिंच एक एक्यूएस है जो बदले में LockSupport का उपयोग करता है।

यह सब आपके लिए कवर के तहत किया गया है।

संपादित करें:

नहीं की AbstractQueuedSynchronizer (AQS) का व्यावहारिक उपयोग पर चलते हैं।

कन्करेंसी निर्माण करती है, हालांकि उनके उपयोग में बहुत अलग हो सकती सभी एक ही अंतर्निहित कार्यों हो सकता है।

आईई। कुछ स्थितियों के तहत इस धागे को पार्क करें। किसी अन्य स्थिति के तहत एक थ्रेड उठो।

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

  • ReentrantLock
  • ReadLock
  • WriteLock
  • Semaphore
  • CountDownLatch

अब, इन सभी पांच संरचनाओं जब उन्हें प्रयोग नियमों का बहुत अलग सेट है। एक CountdownLatch कई धागे एक ही समय में चलाने की अनुमति दे सकता है लेकिन एक (या अधिक) धागे को तब तक प्रतीक्षा करने के लिए मजबूर करता है जब तक कि कम से कम संख्या में धागे ने कहा था।

ReentrantLock एक महत्वपूर्ण खंड में प्रवेश करने के लिए केवल एक थ्रेड को मजबूर करता है और इसे पूरा करने के लिए प्रतीक्षा करने के लिए अन्य सभी धागे को कतार में डाल देता है।

ReadLock किसी भी लिखने के धागे को तब तक महत्वपूर्ण खंड में पढ़ने की अनुमति देता है जब तक एक लिखने वाले लॉक को अधिग्रहित नहीं किया जाता है।

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

+0

डब्ल्यू: मैंने देखा LockSupport 'AbstractQueuedLongSynchronizer' में प्रयोग किया जाता है, आप का सुझाव यह एक तरह से है आंतरिक एपीआई कक्षा? बस इसके लिए कोड का कोई भी चित्रकारी टुकड़ा देखना चाहता था ... – Max

+2

@ मैक्स लॉकसपोर्ट एक उपयोगिता वर्ग है जिसे कोई भी उपयोग कर सकता है। यह जरूरी नहीं है कि एक आंतरिक वर्ग Unsafe.java एक आंतरिक वर्ग का एक अच्छा उदाहरण है। लॉकस्पोर्ट सार्वजनिक है ताकि अन्य लोग AQS –

+0

डब्ल्यू का अपना संस्करण लिख सकें। धन्यवाद जॉन, मुझे पता है कि यह विस्तार के लिए है। आपके उत्तर ने मुझे एक प्रश्न दोहराया: आम तौर पर 'सारणी क्यूयूड सिंक्रनाइज़र' का उपयोग मेरे लिए अस्पष्ट दिखाई देता है। – Max

1

वे क्लाइंट कोड में प्रत्यक्ष उपयोग के लिए नहीं हैं; नई समवर्ती कक्षाओं के निर्माण में मदद के लिए और अधिक।

1

एक्यूएस समवर्ती प्राइमेटिव बनाने के लिए एक अद्भुत वर्ग है - लेकिन यह जटिल है और इसे ठीक से उपयोग करने के लिए थोड़ा सा अध्ययन की आवश्यकता है। मैंने इसे कुछ चीजों के लिए उपयोग किया है जैसे lazy initialisation और एक साधारण तेज़ reusable latch

जितना जटिल है, मुझे नहीं लगता कि एक्यूएस विशेष रूप से अस्पष्ट है, इसमें उत्कृष्ट जैवडॉक्स का वर्णन है कि इसका सही तरीके से उपयोग कैसे किया जाए।

+0

बिल्कुल एक्यूएस क्या है? – Pacerier

+0

java.util.concurrent.AbstractQueued सिंक्रनाइज़र –

+0

वास्तव में: java.util.concurrent.locks.AbstractQueued सिंक्रनाइज़र –

0

AFAIK, सारक्यूयूड सिंक्रनाइज़र का उपयोग राज्य संक्रमणों को प्रबंधित करने के लिए किया जाता है। जेडीके जावा का उपयोग करने के लिए इसका उपयोग करता है, java.util.concurrent.FutureTask के लिए एक आंतरिक वर्ग। सिंक क्लास फ्यूचरटास्क के राज्यों (तैयार, रनिंग, आरएएन, और कैंसलेड) का प्रबंधन करता है और उनके बीच संक्रमण करता है।

उदाहरण के लिए, RAN राज्य तक पहुंचने तक FutureTask को FutureTask.get() पर अवरुद्ध करने के लिए, फ़्यूचरटास्क की अनुमति देता है, उदाहरण के लिए। Disruptor की

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