2012-06-30 51 views
11

मैंने बयान पर सभी जावा documentation स्कैन किए बिना किसी प्रश्न के उत्तर के लिए इस प्रश्न का उत्तर खोज रहे हैं।सिंक्रनाइज़ रिहाई ऑर्डर

कहें कि मेरे पास thread1, thread2, thread3 एक ही समय में निम्नलिखित कोड चलाने की कोशिश कर रहा है।

synchronized(lockObj) { 
    doSomething(); 
} 

thread1 पहले doSomething(), thread2 हो जाता है तो thread3 जो ब्लॉक और synchronized बयान पर इंतजार करेंगे मान लें।

प्रश्न

  1. जब thread1 रिलीज ताला, जो धागे की पहली जारी किया जाएगा?
  2. सामान्य आदेश नियम क्या है जो लॉक जारी करते समय लागू होता है?
+0

क्यों बस (के रूप में एक [ArrayBlockingQueue] http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html का उपयोग नहीं एक BlockingQueue इस तरह के) या कुछ समान है? या मैं आपका प्रश्न समझ नहीं रहा हूं। –

+2

मैं इसे एक ही अवधि में जोड़ दूंगा: मॉनिटर पर प्रतीक्षा करने वाले थ्रेड प्रतीक्षा में सूचीबद्ध होते हैं [** सेट **] (http://docs.oracle.com/javase/specs/jls/se7/html/jls -17.html # jls-17.2)। –

+1

@ होवरक्राफ्टफुलऑफल्स मेरा भ्रम वास्तव में इस कोड को पढ़ने के बाद शुरू हुआ http://www.tutorialspoint.com/java/java_thread_synchronization.htm मैंने हमेशा ताले सोचा है जहां एक फीफो तरीके से प्रबंधित किया गया है लेकिन स्पष्ट रूप से लिंक के लिए – GETah

उत्तर

21

1. या तो थ्रेड 2 या थ्रेड 3।

इसी तरह, कोई मान्यताओं जिस क्रम में धागे को मॉनिटर पर या आदेश के मालिकाना हक दिया जाता है के बारे में किया जाना चाहिए, जिसमें धागे को सूचित या notifyAll विधि

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/thread-priorities.html#general के जवाब में जगा: वहाँ कोई गारंटी नहीं है

2. जावा मॉनीटर (सिंक्रनाइज़/प्रतीक्षा/अधिसूचना/सूचित करें) सभी निष्पक्ष हैं। जावा 1.5 से सिंक्रनाइज़ेशन प्राइमेटिव्स में आमतौर पर निष्पक्षता को लागू करने के लिए पैरामीटर होते हैं। सलाह दी जाती है कि निष्पक्ष संस्करण में काफी प्रदर्शन जुर्माना है, आमतौर पर गैर-निष्पक्ष संस्करण का उपयोग किया जाना चाहिए: सांख्यिकीय रूप से, प्रत्येक थ्रेड को चलाने का मौका दिया जाएगा, भले ही ऑर्डर सख्ती से लागू न हो।

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

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html#ReentrantLock%28boolean%29

+0

+1 नहीं है! – GETah

+1

हम्म, मुझे पता था कि थ्रेडिंग के साथ कोई गारंटी नहीं थी, लेकिन मैंने हमेशा लॉक कतार की कल्पना की, आपको पता है, कतार, फीफो और सभी चीजों के साथ। अच्छा उत्तर। –

+0

@ डेनिस टुल्स्की जेएलएस ने कभी कतार का उल्लेख नहीं किया, लेकिन एक सेट। यह काफ़ी कुछ कहता है। –