2016-02-12 6 views
5

थ्रेड सुरक्षा को संरक्षित करते समय हम एकाधिक समवर्ती डेटा संरचनाओं तक कैसे पहुंच सकते हैं? सिंक्रनाइज़ेशन के बिना ऐसा करना संभव है?एकाधिक समवर्ती डेटा संरचनाओं के लिए थ्रेड-सुरक्षित पहुंच

एक साधारण उदाहरण के रूप में:

ConcurrentHashmap m; 
CopyOnWriteArrayList l; 

public bool enterListNode(int elem) { 
    Node node = l.get(elem); 
    String key = node.key(); //key is immutable 
    int val = node.val(); //val is immutable 
    val = m.putIfAbsent(key, val); 
    return val; 
} 

यह उदाहरण linearizable नहीं है, क्योंकि यह संभव है हम करते हैं जब कि putIfAbsent(key, val), कि (node==l.get(elem)) अब सच है।

क्या लॉक जोड़ने के अलावा इस से निपटने का कोई तरीका है?

+3

यह एक अच्छा सवाल है जो बाह्य स्रोतों (यानी उदाहरण) के लिए पूछने के कारण खतरनाक रूप से ऑफ-विषय के करीब स्कर्ट कर रहा था। मैंने उस समस्या से बचने के लिए इसे दोहराया है। यदि आप महसूस करते हैं कि यह बहुत अधिक परिवर्तन है तो आप वापस या संपादित कर सकते हैं। आप [सहायता] की समीक्षा करना और पॉइंटर्स के लिए [पूछना] पढ़ना चाहेंगे। इस विशिष्ट उदाहरण के लिए –

+0

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

उत्तर

0

यदि उदाहरण के लिए, आप जिस वस्तु को सूची में डालते हैं l कभी नहीं बदला जाता है, लेकिन ऑब्जेक्ट Node ऑब्जेक्ट में निहित मान संशोधित किए जाते हैं, तो आपको लॉक की आवश्यकता नहीं होगी। लेकिन इसे लागू करना मुश्किल होगा, क्योंकि आपको अपने कार्यक्रम की शुरुआत में खाली वस्तुओं के साथ अपने ऐरे को भरना होगा।

फिर, सूची से पुनर्प्राप्त सभी ऑब्जेक्ट्स सूची में समान होंगे और आप सुरक्षित रहेंगे।

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