2010-05-24 13 views
15

जावा में सिंक्रनाइज़() को मिलाकर, ReentrantLock.lock() और ReetrantLock.unlock() उसी लॉकिंग तंत्र का उपयोग synchronized() के रूप में करें?ReentrantLock.lock()

मेरा अनुमान है "नहीं," लेकिन मुझे गलत होने की उम्मीद है।

उदाहरण:

कल्पना कीजिए कि थ्रेड 1 और थ्रेड 2 दोनों की पहुंच है:

ReentrantLock lock = new ReentrantLock(); 

थ्रेड 1 रन:

synchronized (lock) { 
    // blah 
} 

थ्रेड 2 रन:

lock.lock(); 
try { 
    // blah 
} 
finally { 
    lock.unlock(); 
} 

मान लें कि थ्रेड 1 पहुंचता है इसके पहले भाग, तो थ्रेड 1 समाप्त होने से पहले थ्रेड 2: थ्रेड 2 थ्रेड 1 के लिए synchronized() ब्लॉक छोड़ने के लिए प्रतीक्षा करेगा, या यह आगे बढ़ेगा और चलाएगा?

उत्तर

14

नहीं, थ्रेड 2 lock() भी हो सकता है जब थ्रेड 1 synchronized उसी lock पर भी हो।

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

+0

यही मुझे लगा। एक ऐसी जगह है जहां मुझे 'ReetrantLock.tryLock()' का उपयोग करने की आवश्यकता है, और मैं हर जगह 'सिंक्रनाइज़' के साथ दूर होने की उम्मीद कर रहा था। धन्यवाद। –

9

दो तंत्र अलग हैं। कार्यान्वयन/प्रदर्शन के अनुसार:

  • सिंक्रनाइज़ तंत्र एक लॉकिंग तंत्र का उपयोग करता है जो "जेवीएम" में बनाया गया है; अंतर्निहित तंत्र विशेष जेवीएम कार्यान्वयन के अधीन है, लेकिन आमतौर पर उन मामलों के लिए कच्चे compare-and-set operation (सीएएस) निर्देश के संयोजन का उपयोग करता है जहां लॉक का विरोध नहीं किया जाता है और ओएस द्वारा प्रदान की गई अंतर्निहित लॉकिंग तंत्र;
  • रींट्रंट लॉक जैसे ताला वर्ग मूल रूप से शुद्ध जावा में कोड किए गए हैं (जावा 5 में पेश की गई लाइब्रेरी के माध्यम से जो सीएएस निर्देशों और जावा को थ्रेडेडलिंग का खुलासा करता है) और इसलिए कुछ ओएस और अधिक नियंत्रित करने योग्य (नीचे देखें) में कुछ और मानकीकृत है।

कुछ परिस्थितियों में, स्पष्ट ताले बेहतर प्रदर्शन कर सकते हैं। यदि आप जावा 5 के तहत किए गए इस comparison of locking mechanisms को देखते हैं, तो आप देखेंगे कि उस विशेष परीक्षण (एक सरणी तक पहुंचने वाले एकाधिक थ्रेड) में, "अनुचित" मोड (पीले और सियान त्रिकोण) में कॉन्फ़िगर किए गए स्पष्ट लॉक क्लास सादे से अधिक थ्रूपुट की अनुमति देते हैं सिंक्रनाइज़ (बैंगनी तीर)।

(मुझे यह भी कहना चाहिए कि सिंक्रनाइज़ किए गए प्रदर्शन को हॉटस्पॉट के हाल के संस्करणों में सुधार किया गया है; इसमें नवीनतम संस्करणों या वास्तव में अन्य परिस्थितियों में बहुत कुछ नहीं हो सकता है - यह स्पष्ट रूप से एक पर्यावरण में एक परीक्षण है ।)

कार्यक्षमता वार:

  • सिंक्रनाइज़ तंत्र प्रदान करता है कम से कम कार्यक्षमता (आप लॉक कर सकते हैं और अनलॉक, ताला एक सभी या कुछ भी नहीं आपरेशन है, तो आप एल्गोरिथ्म ओएस लेखकों का फैसला करने के लिए और अधिक अधीन हैं या नहीं चालू), हालांकि अंतर्निहित वाक्यविन्यास और JVM में निर्मित कुछ निगरानी के लाभ के साथ;
  • स्पष्ट ताला कक्षाएं अधिक नियंत्रण प्रदान करते हैं, विशेष रूप से अगर आप लॉक की behiour को बदलने के लिए जरुरी है, एक 'निष्पक्ष' ताला, एक टाइमआउट के साथ ताला निर्दिष्ट कर सकते हैं ...
0

क्यों आप संतुलन बनाने की थी खाता वर्ग में स्थिर? स्थैतिक निकालें और इसे काम करना चाहिए।

इसके अलावा, अपने धागे के उपयोग के बारे में एक प्रश्न है। अपने टेस्टमेन में आप नए थ्रेड बनाते हैं और Rundables असाइन करते हैं जैसे WithdrawRequests & DepositRequests। लेकिन फिर आप उन रननेबल के रचनाकारों के अंदर नए धागे बनाते हैं। इससे रन विधि को दो बार निष्पादित किया जाएगा!