2009-11-26 4 views
8

हमारे पास एक सिंक्रनाइज़ विधि के माध्यम से एक सूची तक पहुंचने के दो धागे हैं। कर सकते हैं हमसुनिश्चित करें कि जावा synchonized ताले आदेश में लिया जाता है?

एक) रन टाइम पर भरोसा करते हैं यह सुनिश्चित करें कि उनमें से प्रत्येक के क्रम में वे करने के लिए या

ख की कोशिश की के आधार पर विधि के लिए उपयोग प्राप्त होगा बनाने के लिए) वी एम किसी अन्य नियमों का पालन करता है

सी) अनुरोधों को क्रमबद्ध करने का एक बेहतर तरीका है?

बहुत धन्यवाद!

+1

यह काफी संभावना नहीं तुम सच में इस आवश्यकता की जरूरत है। आप पाएंगे कि ReentrantLock (true) का उपयोग सिंक्रनाइज़ किए गए पूरे ऑपरेशन को करने से काफी धीमा है। –

उत्तर

17

नहीं, सिंक्रनाइज़ किए गए किसी भी क्रम में पहुंच प्रदान करेगा (JVM कार्यान्वयन पर निर्भर करता है)। यह कुछ परिदृश्यों में थ्रेड को भूखा भी कर सकता है।

fair=true विकल्प के साथ आप ReentrantLock (जावा 5.0 के बाद) का उपयोग कर ऑर्डर सुनिश्चित कर सकते हैं। (Lock lock = new ReentrantLock(true);)

+4

"सिंक्रनाइज़ किए गए यादृच्छिक क्रम में पहुंच प्रदान करेगा (या लॉक को पकड़ने वाला सबसे तेज़ कौन है)"। आदेश बस निर्दिष्ट नहीं है। यह लगभग निश्चित रूप से यादृच्छिक नहीं है, और यह कार्यान्वयन निर्भर है (और अत्यधिक संभावना नहीं है) कि "पहला" धागा हमेशा लॉक प्राप्त करेगा ... विशेष रूप से एक मल्टीप्रोसेसर सिस्टम पर। –

+2

आप सही हैं, स्टीफन। लेकिन आप एक विशिष्ट कार्यान्वयन पर रिले नहीं कर सकते हैं, इसलिए प्रोग्रामर को यादृच्छिक व्यवहार की अपेक्षा करनी चाहिए। – Hardcoded

+1

आदेश यादृच्छिक नहीं है और न ही यह यादृच्छिक होने की गारंटी है। जैसे ही एक थ्रेड ब्लॉक इसे संदर्भित किया जा सकता है, इसलिए यह थोड़ी देर के लिए फिर से प्रयास नहीं करेगा ताकि आप एक थ्रेड को कई बार लॉक प्राप्त कर सकें, इससे पहले कि किसी अन्य धागे को जागने का मौका मिले। –

-1

हां।

यदि सूची तक पहुंच एक सिंक्रनाइज़ विधि के माध्यम से है, तो एकाधिक धागे से समवर्ती अनुरोधों को क्रमबद्ध किया जाएगा।

+2

@ कॉनराड। मुझे यह सच नहीं लगता है। जब एकाधिक धागे मॉनिटर के लिए इंतजार कर रहे हैं तो उनमें से किसी एक को कार्यान्वयन के आधार पर सम्मानित किया जा सकता है। हम यह सुनिश्चित नहीं कर सकते कि मॉनिटर को इसके लिए अनुरोध किए गए थ्रेड के क्रम में सम्मानित किया जाएगा। – Varun

+4

आप एक छोटे से अलग सवाल का जवाब दे रहे हैं कि क्या पूछा गया था। श्री जी प्रतिस्पर्धी सिंक्रनाइज़ किए गए ब्लॉक के शेड्यूलिंग ऑर्डर के बारे में पूछ रहे हैं, न कि सिंक्रनाइज़ किए गए ब्लॉक का पालन किया जाता है या नहीं। –

+0

हाँ, हालांकि मुझे लगता है कि इससे ज्यादातर समय कोई फर्क नहीं पड़ता। –

10

नहीं, आप यह सुनिश्चित नहीं कर सकते कि एक सिंक्रनाइज़ विधि के लिए दो कॉल क्रम में होंगे। आदेश अनिर्दिष्ट और कार्यान्वयन निर्भर है।

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

+0

आपके उत्तर की तरह, हालांकि कुछ भी नहीं कहने के लिए यह जरूरी नहीं है कि कोई आदेश नहीं होगा, इसलिए मुझे लगता है कि यह कार्यान्वयन पर निर्भर करेगा। और मुझे लगता है कि हॉटस्पॉट/ओपनजेडीके ओएस थ्रेड शेड्यूलर पर भरोसा करता है। – user454322

+0

@ user454322 - यह एक उचित मूल्यांकन है। –

3

आप उस आदेश पर भरोसा नहीं कर सकते जिसमें प्रत्येक थ्रेड से विशेष विधि को बुलाया जाता है। यदि यह केवल दो धागे हाँ हो सकता है। लेकिन कल्पना करें कि 3 थ्रेड्स और 1 थ्रेड पहले ही अधिग्रहित हैं। जब वे पहुंचने का प्रयास करते हैं तो अन्य 2 थ्रेड इंतजार करेंगे और उनमें से किसी एक को एक्सेस से सम्मानित किया जा सकता है, और यह उस क्रम पर निर्भर नहीं है जिसमें उन्होंने इस विधि को बुलाया था। तो, आदेश पर भरोसा करने का सुझाव नहीं दिया जाता है।

+3

"तो, आदेश पर भरोसा करने का सुझाव नहीं दिया जाता है।" - कि एक क्म्व्यनी है!! मैं कहूंगा कि इस पर भरोसा करने वाला कोई भी कार्यक्रम * निश्चित रूप से * गैर-पोर्टेबल है, और संभवतः * प्लेटफॉर्म पर * बग्गी इसे लागू/परीक्षण किया गया था! –

+0

@Stephen अधिक सहमत नहीं हो सकता है। – Varun

0

सी) अनुरोधों को क्रमबद्ध करने का एक बेहतर तरीका है?

क्या आप किसी कतार के रूप में सूची का उपयोग कर किसी भी मौके से हैं, यानी, क्या उपयोग पैटर्न इस तरह कुछ दिखता है?

 
while (some condition) { 
    synchronized(theList){ 
     anItem = get and remove an element from theList 
    } 
    do some work with anItem 
} 

यदि हां, तो आप के बजाय अपने खुद के लॉकिंग योजनाओं का उपयोग करने का BlockingQueue इंटरफ़ेस को देखने के लिए चाहते हो सकता है। कार्यान्वयन (जैसे ArrayBlockingQueue) में निष्पक्षता और अधिक के लिए सेटिंग्स हैं।

0

मैं हमेशा अनुप्रयोग सर्वर या इंजन समन्वयन करता छोड़ जब तक खुद तीव्रता को परिभाषित करने

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

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