2011-04-15 6 views
9

ब्रायन गोएज़ की किताब, अभ्यास में जावा संगामिति, एक रैत्रांत ताला के बारे में उनकी उदाहरण में इस तरह प्रोग्राम किया जाता है:एक पुनर्विक्रेता लॉक स्थिर बना रहा है और इसे एक म्यूटेक्स बना देता है?

private static final Lock lock = new ReentrantLock(); 
:

Lock lock = new ReentrantLock(); 

हालांकि, मैं अगर करने के लिए ऊपर दिए गए कोड को बदलने पता करने के लिए उत्सुक हूँ

लॉक को अब म्यूटेक्स के रूप में कार्य करने का कारण बनता है, या यदि यह अनावश्यक और अनावश्यक है।

इस प्रकार, क्या लॉक निजी, स्थैतिक और अंतिम बनाया गया है, तो इस कोड की कार्यक्षमता बदलती है?

lock.lock(); 
try { 
    //method stuff 
} finally { 
    lock.unlock(); 
} 

सभी को अग्रिम धन्यवाद। मैट

उत्तर

18

हां।

final और private का कोई प्रभाव नहीं है, लेकिन static का अर्थ है कि सभी उदाहरण एक ही लॉक साझा करते हैं।

तो यदि आपके पास दो उदाहरण हैं, तो कोड ब्लॉक को एक ही समय में दो धागे द्वारा निष्पादित नहीं किया जा सकता है।

यदि लॉक स्थिर नहीं है, तो प्रत्येक इंस्टेंस को अपना लॉक मिलता है। इसका मतलब है कि अधिक थ्रेड एक ही समय में कोड चला सकते हैं (निश्चित रूप से वे किस उदाहरण पर काम करते हैं)।

+0

बिल्कुल सही में करने के लिए

synchronized(MyClass.class){ } 

इसके equivallent है। धन्यवाद। –

+1

सिंक्रनाइज़ किए गए कीवर्ड बनाम ताले के बारे में अधिक जानकारी के लिए http://www.ibm.com/developerworks/java/library/j-jtp10264/ भी देखें। –

+0

इस पोस्ट को जमीन से बाहर खोदने के लिए खेद है, लेकिन मैं अब इस विषय को देख रहा हूं। मुझे दिलचस्पी है कि 'निजी स्थैतिक अंतिम पुनर्वित्त लॉक लॉक' को कोड गंध नहीं माना जाता है? मैंने पढ़ा है कि स्थैतिक चर बुरा हैं, फिर भी मेरा वर्तमान उपयोग केस मैं काम करने के लिए आदर्श स्थान की तरह दिख रहा हूं। मदद करने के लिए देखभाल? – Bobzone

3

एक स्थिर लॉक बनाना सार एक वर्ग स्तर ताला

+0

बिल्कुल नहीं। कक्षा सार्वजनिक है, कोई भी कॉलर लॉक कर सकता है। निर्दिष्ट पुनर्वित्त लॉक निजी है, इसलिए केवल क्लास उस लॉक तक पहुंच सकता है। –

+0

आप मानते हैं कि कक्षा सार्वजनिक है, न कि बच्चे, निजी, संरक्षित या पैकेज-संरक्षित। फिर भी, मेरा जवाब ताला और कक्षा के बीच संबंधों को प्रदर्शित करने के लिए और अधिक था। –

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