2011-02-06 12 views
16

जहाँ तक मुझे पता है, wait() और notify() को बेहतर समवर्ती तंत्र के साथ बदल दिया गया है। तो, a synchronized queue को लागू करने के लिए कहें, आप क्या बेहतर विकल्प चुनेंगे?प्रतीक्षा करने का सबसे अच्छा विकल्प क्या है ... निम्न स्तर सिंक्रनाइज़ेशन के लिए सूचित करें?

किस अर्थ में वे वास्तव में "बेहतर" हैं?

संपादित करें: यह ("एक तुल्यकालिक कतार लागू करें") एक साक्षात्कार प्रश्न है। एक स्वीकार्य उत्तर BlockingQueue या अन्य कतार कार्यान्वयन का उपयोग नहीं कर सकता है। हालांकि, यह काउंटरडाउनलैच जैसे अन्य सिंक्रनाइज़ेशन संरचनाओं का उपयोग कर सकता है। मेरे पास अनुमत और वर्जित कक्षाओं की विस्तृत सूची नहीं है - अपने सिर का उपयोग करें।

+7

मैं एक सिंक्रनाइज़ कतार लागू नहीं करता। मैं BlockingQueue के कई कार्यान्वयनों में से एक का उपयोग करता हूं: http://download.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html –

+1

@ माइक - मैं नौकरी साक्षात्कार के लिए तैयारी कर रहा हूं । वास्तविक जीवन में, मैं पुनर्वित्त के बजाय मौजूदा कुछ का उपयोग करता हूं। – ripper234

+0

तब मुझे डर है कि मैं सवाल समझ नहीं पा रहा हूं। सिंक्रनाइज़ किए गए ब्लॉक और प्रतीक्षा/अधिसूचना को java.util.concurrent पैकेज में कक्षाओं के रूप में उच्च-स्तरीय अबास्ट्रक्शन द्वारा प्रतिस्थापित किया गया है, न कि नई भाषा संरचनाओं द्वारा। यदि प्रश्न का इरादा java.util.concurrent कक्षाओं में से कुछ का उपयोग करना है, तो हमें किसके जवाब देने से बाहर रखा गया है? –

उत्तर

17

synchronized/wait()/notify()/notifyAll() सीधे लॉक क्लास विधियों lock()/unlock()/newCondition() और कंडीशन के await()/signal()/signalAll() द्वारा प्रतिस्थापित किया गया है।

निष्पक्षता नीतियों के साथ-साथ वितरित लॉकिंग जैसी सुविधाओं जैसे अतिरिक्त अर्थशास्त्र की अनुमति देने के लिए इनके लिए कई लाभ हैं। कई Condition वस्तुओं के लिए समर्थन बहुत महीन सुक्ष्म संकेत के साथ ही अबाधित प्रतीक्षा और कुछ समय आदि

उदाहरण के लिए जब तक प्रतीक्षा करने के लिए अनुमति देता है, लेकिन संबद्ध कोड अलग वस्तुओं यह संकेत के लिए (जो की वजह से असफल हो जायेगी उपयोग करने का प्रयास किया है तथ्य यह है कि प्रासंगिक मॉनीटर प्रतीक्षा करते समय नहीं आयोजित किए जाते हैं)। यह कई स्थितियों के साथ एक लॉक के उपयोग से सीधे बदला जा सकता है।

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

3

ArrayBlockingQueue कार्यान्वयन के स्रोत को पढ़ने से ऑब्जेक्ट मॉनीटर विधियों "प्रतीक्षा/अधिसूचना/सूचित करें" के प्रतिस्थापन के रूप में Conditions का उपयोग पता चलता है। इसके अलावा, एक समान पारस्परिक बहिष्करण व्यवहार और अर्थशास्त्र प्राप्त करने के लिए "सिंक्रनाइज़" कीवर्ड के बजाय ReentrantLock का उपयोग किया जाता है। तो ऐसा लगता है कि java.util.concurrent.locks पैकेज वह है जिसे आप ढूंढ रहे हैं। ये नए इंटरफेस बेहतर हैं क्योंकि वे मूल सिंक्रनाइज़ेशन और लॉकिंग संरचनाओं के साथ अतिरिक्त कार्यक्षमता प्रदान नहीं करते हैं, जैसे एकाधिक प्रतीक्षा-सेट और चुनिंदा पढ़ने या लिखने वाले ताले (हमेशा और लिखने के बजाय)।

java.util.concurrent.atomic पैकेज भी compare-and-swap निर्देश जो non-blocking algorithms लिए उपयोगी होते हैं, जो संभवतः उनके अवरुद्ध विकल्पों से बहुत तेजी से कर रहे हैं, लेकिन अपने स्वयं के चुनौतियों के लिए इंटरफेस प्रदान करता है।

+0

कृपया मेरा संपादित प्रश्न देखें - यह वास्तव में एक प्रासंगिक उत्तर नहीं है। – ripper234

+0

गोटा, यहां पर एक और स्टैब है। – maerics

4

java.util.concurrent पैकेज में पहले से ही बहुत अधिक कार्यान्वयन मौजूद हैं। जैसे - ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue

wait() और notify() को प्रतिस्थापित नहीं किया गया है। नई उपयोगिताएं पेश की गई हैं जो अतिरिक्त कार्यक्षमताओं और प्रदर्शन लाभ प्रदान करती हैं। उदाहरण के लिए java.util.concurrent.locks पैकेज देखें।

मैं आपको this परिचय पढ़ने की सलाह दूंगा। यह एक उच्च अवलोकन प्रदान करता है जो आपके प्रश्न का उत्तर देना चाहिए।

चीयर्स।

संपादित करें 1: ठीक है, तो उदाहरण के लिए आप java.util.concurrent.locks .Lock के एक कार्यान्वयन एक विपंक्ति आपरेशन कि बार-आउट लागू करने के लिए और उपयोग कर सकते हैं धागे कतार तक पहुँचने के लिए एक ही समय अनुदान निष्पक्षता में। इस तरह के कार्यान्वयन ReentrantLock है जिसमें एक निर्माता है जो निष्पक्षता नीति स्वीकार करता है। समय tryLock() इस संपत्ति का समर्थन करता है। इसके अलावा आप कतार, आदि पर प्रतीक्षा धागे की गिनती के लिए कुछ डिबगिंग समर्थन जोड़ सकते हैं। मुझे लगता है कि wait() और notify() के साथ बस इसे लागू करना अधिक कठिन होगा।

निष्कर्ष ReentrantLock इसकी विस्तारित क्षमताओं में निम्न स्तर के समकक्षों की तुलना में "बेहतर" है। हालांकि मूल व्यवहार वही है। यदि आपको इन अतिरिक्त wait() और notify() की आवश्यकता नहीं है, तो अभी भी स्वीकार्य विकल्प हैं।

+0

कृपया मेरा संपादित प्रश्न देखें - यह वास्तव में एक प्रासंगिक उत्तर नहीं है। – ripper234

+0

ठीक है, तो मैंने एक नई उच्च स्तरीय उपयोगिता - लॉक का उपयोग करने के लिए एक नमूना सुझाव दिया। –

0

पार्क() अनपर्क() अनलॉक() विधियों को लॉकसपोर्ट श्रेणी इस मामले में उपयोगी प्रतीत होता है। मुझे भी एक ही प्रश्न का सामना करना पड़ा और नेट पर खोज करते समय, इस चर्चा में एक सुराग मिला।

Synchronization vs Lock

लेकिन मैं अवधारणाओं को समझने के लिए आगे एक नमूना आवेदन बनाना होगा।

0

समवर्ती पैकेज से सेमफोर का उपयोग करने के बारे में कैसे? एक बाइनरी सेमफोर का उपयोग आंतरिक लॉक के रूप में और कतार के आकार पर बाध्य करने के लिए दो गिनती सेमफोरों का उपयोग करना?

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