इस सवाल का कई जवाब में सुझाव दिया गया है:क्या रीडवाइट लॉक सिंक्रनाइज़ किए गए कीवर्ड को अनावश्यक प्रस्तुत करता है?
What is the name of this locking technique?
मैं एक ReentrantReadWriteLock लागू किया है और एक महान speedup देखा (मुझे पता था कि एक मेरी कक्षा में कुछ लॉक विवाद और एक रैत्रांत ताला मदद गति बातें किया था का उपयोग कर रही थी तक)।
लेकिन अब मैं सोच रहा हूँ: अगर सब पहुँच एक क्लास के भीतर (दोनों रीड और राईट) पहले या तो एक पढ़ा-लॉक या एक लेख ताला ताला लगा द्वारा किया जाता है, इसका मतलब यह है सिंक्रनाइज़ कीवर्ड नहीं होना चाहिए उस वर्ग में अब और इस्तेमाल किया?
उदाहरण के लिए, यहाँ एक आधिकारिक जावा 1.6 उदाहरण http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html
class RWDictionary {
private final Map<String, Data> m = new TreeMap<String, Data>();
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
public Data get(String key) {
r.lock();
try { return m.get(key); }
finally { r.unlock(); }
}
public String[] allKeys() {
r.lock();
try { return m.keySet().toArray(); }
finally { r.unlock(); }
}
public Data put(String key, Data value) {
w.lock();
try { return m.put(key, value); }
finally { w.unlock(); }
}
public void clear() {
w.lock();
try { m.clear(); }
finally { w.unlock(); }
}
}
में पाया कोई सिंक्रनाइज़ कीवर्ड है।
अब मुझे एहसास है कि इस तरह के ताले के बिंदु में से एक अन्य तरीकों से तेज़ होना है (इस मामले में सिंक्रनाइज़ करें) लेकिन इसके पीछे तकनीकी स्पष्टीकरण क्या है?
क्या प्रत्येक विधि/अद्यतन विधि में एक वर्ग में रीड-राइट लॉक का उपयोग इन विधियों के लिए कीवर्ड सिंक्रनाइज़ करता है?
मुझे लगता है कि आप उदाहरण पर सिंक्रनाइज़ कर रहे थे, जैसे 'सिंक्रनाइज़ (यह)'। इसके बजाए, यदि आप दो अलग-अलग ऑब्जेक्ट्स पर सिंक्रनाइज़ करते हैं, तो पढ़ने के लिए और एक लिखने के लिए, आप एक ही प्रदर्शन प्राप्त कर लेते। 'इस 'सिंक के साथ, जब' put' संसाधित किया जा रहा है, अनावश्यक रूप से 'get' भी प्रतीक्षा करने के लिए बनाया जाता है। विभिन्न लॉकिंग ऑब्जेक्ट्स के साथ, यह विवाद दूर हो जाता है। – srkavin
अधिकांश नक्शा कार्यान्वयन के लिए यह * प्रगति पर है, जबकि प्रतीक्षा करने के लिए आवश्यक है *। – Affe
@srkavin विवाद दूर हो गया होगा, लेकिन स्मृति दृश्यता की गारंटी भी होगी। आपके 'get'' को 'put' से आंशिक अपडेट देखा होगा, क्योंकि वे एक-दूसरे के सापेक्ष सिंक्रनाइज़ नहीं किए गए थे। – yshavit