क्या किसी प्रकार का संदर्भ लागू करने का कोई तरीका है जिसका मूल्य किसी अन्य के साथ आदान-प्रदान किया जा सकता है?परमाणु संदर्भ बनाने के लिए संभव है जिसे परमाणु रूप से बदला जा सकता है?
जावा में हम AtomicReference
जो एक स्थानीय चर के साथ बदली जा सकती है, लेकिन एक और AtomicReference
साथ नहीं है।
आप कर सकते हैं:
AtomicReference r1 = new AtomicReference("hello");
AtomicReference r2 = new AtomicReference("world");
और उन्हें दो आपरेशन के संयोजन के साथ स्वैप:
r1.set(r2.getAndSet(r1.get()));
लेकिन इस बीच, जहां दोनों "hello"
शामिल में एक असंगत स्थिति में उन्हें छोड़ देता है। इसके अलावा यदि आप उन्हें परमाणु रूप से स्वैप कर सकते हैं, तो भी आप उन्हें (एक जोड़ी के रूप में) परमाणु रूप से पढ़ नहीं पाए।
मैं ऐसा करने में सक्षम होना चाहते हैं क्या है:
PairableAtomicReference r1 = new PairableAtomicReference("hello");
PairableAtomicReference r2 = new PairableAtomicReference("world");
AtomicRefPair rp = new AtomicRefPair(r1, r2);
तो
Object[] oldVal, newVal;
do {
oldVal = rp.get();
newVal = new Object[] {oldVal[1], oldVal[0]};
} while (! rp.compareAndSet(oldVal, newVal));
मूल्यों स्वैप करने के लिए, और एक अन्य सूत्र में:
AtomicRefPair otherRP = new AtomicRefPair(r1, r2);
System.out.println(Arrays.toString(otherRP.get()));
और सुनिश्चित करें कि आउटपुट या तोहोगाया [world, hello]
।
नोट्स:
r1
औरr2
इस कार्रवाई के लिए जोड़ा जाता है, लेकिन यह संभव है कि एक और धागा स्वतंत्र रूप से युग्मित हो जाएगा है, कहते हैं किr1
और एक अन्यr3
- वहाँ (दुर्भाग्य से इसका मतलब है कि मैं this solution उपयोग नहीं कर सकते।) इन संदर्भों में से सैकड़ों हजारों होंगे, इसलिए वैश्विक
ReentrantLock
एक बड़ी बाधा होगी। rp
औरotherRP
आवश्यक रूप से धागे के बीच साझा नहीं किए जाते हैं, इसलिए बस उन्हें लॉक करना काम नहीं करेगा। वे interned हो सकते हैं, लेकिन इंटर्न पूल को अपने सिंक्रनाइज़ेशन की आवश्यकता होगी जो एक और बाधा होगी।- मैंने केवल 2 संदर्भों के समूह बनाए हैं, लेकिन 3 या उससे अधिक समूह बनाने की क्षमता बोनस होगी।
क्या AtomicRefPair
का लॉक-मुक्त संस्करण लागू करना संभव है? मेरे पास एक झुकाव है कि यह नहीं है, लेकिन यदि नहीं तो शायद वहां कोई लेख है जो बताता है क्यों?
संबंधित: How do I atomically swap 2 ints in C#?
अमरूद में एक Interner, जो ConcurrentHashMap का उपयोग करता है, इसलिए विवाद औसतन मनमाने ढंग से छोटे हो सकता है। – maaartinus