2010-10-15 12 views
10

यह प्रश्न this other question से प्रेरित है।जावा: सिंक्रनाइज़ ब्लॉक पर प्रतीक्षा, जो पहले जाता है?

यदि एकाधिक धागे synchronized ब्लॉक पर प्रतीक्षा कर रहे हैं, और लॉक उपलब्ध हो जाता है, तो पहले कौन जाता है? क्या यह थ्रेड प्राथमिकता से है (और फिर पहले आओ-पहले-सेवा)?

और notify के लिए एक ही नियम लागू होते हैं (एकाधिक wait आईएनजी थ्रेड के साथ)?

+1

यदि 'उचित ताले' आप जो खोज रहे हैं, तो java.util.concurrent पैकेज देखें। एक उदाहरण के रूप में, ReEntrantLocks निष्पक्ष हैं। निष्पक्षता इस तथ्य से आती है कि प्रक्रिया समय निर्धारण में 'एजिंग' अवधारणा के अनुरूप, सबसे लंबे समय तक प्रतीक्षा धागे को प्राथमिकता दी जाती है। – questzen

उत्तर

7

इस आदमी के अनुसार: http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html

जावा अनुक्रम के बारे में कोई गारंटी जारी करता है। तो मुझे लगता है कि यह थ्रेड प्राथमिकता

पर आधारित नहीं है, मैं वास्तव में यह तय करने के लिए आगे बढ़ने की कोशिश करूंगा कि कैसे जावा वास्तव में तय करता है कि कौन पहले जाता है।

+2

+1 दिलचस्प। यह पता चला है कि concurrency पैकेज में ताले एक वैकल्पिक निष्पक्षता मोड है, इस मामले में वे फीफो काम करते हैं। यदि नहीं, तो यह मनमाना है। मैंने सोचा होगा कि थ्रेड प्राथमिकता को यहां एक भूमिका निभानी चाहिए। – Thilo

+0

मैं मानता हूं कि "प्राकृतिक" विकल्प होता। –

+2

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

1
अपने दूसरे प्रश्न

उनमें से एक के लिए

जागृत करने की चुना जाता है। पसंद मनमानी है और कार्यान्वयन के विवेकाधिकार पर होता है। एक थ्रेड प्रतीक्षा विधियों में से एक को कॉल करके किसी ऑब्जेक्ट की मॉनिटर पर प्रतीक्षा करता है।

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#notify से()

+0

कोई विचार है कि हॉटस्पॉट कैसे इसे संभालता है? – Thilo

+0

यदि मैं इन दो उत्तरों को थ्रेड प्राथमिकताओं के साथ एक साथ लेता हूं जिसके परिणामस्वरूप लिनक्स पर कम से कम ओएस थ्रेड प्राथमिकताएं नहीं होती हैं (कम से कम ज्यादातर स्थितियों में), तो उन प्राथमिकताओं में बहुत कुछ नहीं लगता है ... – Thilo

+0

@ थिलो यह कार्यान्वयन पर निर्भर करता है। मैं नहीं कह सकता कि ओएस निर्भर है। –

0

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

+0

क्या आप कह रहे हैं कि उच्च प्राथमिकता पहले जाती है? – Thilo

+0

कोई खेद नहीं है कि मैं यह नहीं कह रहा हूं, मुझे उस मामले को याद आया। मैं कह रहा हूं कि निष्पक्षता के कारण कम प्राथमिकता वाले धागे के बाद भी उच्च प्राथमिकता वाले धागे को निष्पादित किया जा सकता है। ऐसा इसलिए है क्योंकि अनुचित ताला कमजोर लचीला गारंटी प्रदान करता है जिसके लिए सभी थ्रेड अंततः लॉक प्राप्त करेंगे। – punkers

4

किसी और ने मेले ताले की उपलब्धता का उल्लेख किया। यदि आप वास्तव में परवाह करते हैं कि पहले कौन जाता है, तो आपके पास वास्तविक समय की समस्या हो सकती है। उस स्थिति में, आप आरटीएसजे का उपयोग कर सकते हैं, जिसमें लॉक अधिग्रहण के ऑर्डरिंग और अन्य अर्थशास्त्र निर्दिष्ट किए गए हैं। विनिर्देश RTSJ Spec में सिंक्रनाइज़ेशन के तहत उपलब्ध हैं। तर्क अनुभाग से हवाला देते हुए:

जावा के सिंक्रनाइज़ कोड के लिए नियमों को पारस्परिक अपवर्जन के लिए एक साधन प्रदान करते हैं लेकिन असीम प्राथमिकता व्युत्क्रम को नहीं रोकते हैं और इस तरह अपर्याप्त वास्तविक समय अनुप्रयोगों के लिए कर रहे हैं। यह विनिर्देश प्राथमिकता विरासत और प्राथमिकता छत अनुकरण के लिए कक्षाओं प्रस्तुत द्वारा अनिवार्य प्राथमिकता उलट नियंत्रण, विशेष रूप से द्वारा सिंक्रनाइज़ कोड के लिए अर्थ विज्ञान मजबूत। प्राथमिकता विरासत को रीयल-टाइम ऑपरेटिंग सिस्टम में और में अधिक व्यापक रूप से लागू किया गया है और इस प्रकार इस विनिर्देश में प्रारंभिक तंत्र है।

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