नेस्टेड सिंक्रनाइज़्ड मानचित्र-जावा, multithreading

मैं सुरक्षित रूप से तत्वों को कैसे रख सकता हूं

ConcurrentMap <String, Set<Integer>> cmap = new ConcurrentMap<String, Set<Integer>>();

मैं अपने समवर्ती मानचित्र पर निम्नानुसार काम करता हूं:

  • यदि कोई कुंजी मौजूद नहीं है: कुछ स्ट्रिंग और एक ब्रांड के साथ एक प्रविष्टि डालें Set<Integer>
  • यदि मौजूद है: एक विशिष्ट जोड़ें Integer इस कुंजी के लिए Set<Integer> मूल्य।

उत्तर:

जवाब के लिए 3 № 1

ConcurrentMap में अनुपलब्ध होने पर मानचित्र मान प्रारंभ करने का एक तरीका है। मुझे लगता है कि सेट भी थ्रेड सुरक्षित होना चाहिए:

Set<Integer> set = cmap.computeIfAbsent(key,(k)->  Collections.newSetFromMap(new ConcurrentHashMap<>()));

set.add(value);

लैम्ब्डा से पहले:

    Set<Integer> set = cmap.get(key);
if (set == null) {
set = Collections.newSetFromMap(new ConcurrentHashMap<>());
Set<Integer> prev = cmap.putIfAbsent(key, set);
if (prev != null) {
set = prev;
}
}
set.add(value);

जवाब के लिए 0 № 2

समवर्ती वातावरण में आपको शायद समवर्ती मानचित्र और समवर्ती सेट का उपयोग करना चाहिए। उदाहरण के लिए ConcurrentHashMap, तथा Collections.newSetFromMap(new ConcurrentHashMap<>())ConcurrentHashMap.putIfAbsent() विधि की दौड़ की स्थिति को रोकें if(!containsKey) put मैकेनिक।

तो कोड जैसा दिखता है

public void add(String s, Integer i) {
cmap.putIfAbsent(s, Collections.newSetFromMap(new ConcurrentHashMap<>()));
Set<Integer> set = cmap.get(s);
set.add(i);
}

संबंधित सवाल
सबसे लोकप्रिय