কিছুটা দেরি হতে পারে তবে এখানে আমার দুটি সেন্ট রয়েছে।
আপনি যদি জাভা 8 ব্যবহার করছেন তবে আপনি কম্পিউটআইফপ্রেসেন্ট পদ্ধতিটি ব্যবহার করতে পারেন । যদি নির্দিষ্ট কীটির মান উপস্থিত থাকে এবং শূন্য হয় তবে এটি কী এবং এর বর্তমান ম্যাপিং মানকে দিয়ে একটি নতুন ম্যাপিং গণনা করার চেষ্টা করে।
final Map<String,Integer> map1 = new HashMap<>();
map1.put("A",0);
map1.put("B",0);
map1.computeIfPresent("B",(k,v)->v+1); //[A=0, B=1]
কী লাগাতে আমরা আরেকটি পদ্ধতি putIfAbsent ব্যবহার করতে পারি । যদি নির্দিষ্ট কীটি ইতিমধ্যে কোনও মানের সাথে সম্পর্কিত না হয় (বা নালায় ম্যাপ করা থাকে) তবে এই পদ্ধতিটি প্রদত্ত মানের সাথে এটি যুক্ত করে এবং নালটি দেয়, অন্যথায় বর্তমান মানটি দেয়।
যদি মানচিত্রটি থ্রেডগুলিতে ভাগ করা হয় তবে আমরা ConcurrentHashMapএবং অ্যাটমিকআইন্টিজার ব্যবহার করতে পারি । ডক থেকে:
একটি AtomicIntegerহল একটি মান মান যা পরমাণুভাবে আপডেট হতে পারে। অ্যাটমিকআইন্টিজার অ্যাপ্লিকেশনগুলিতে যেমন পারমাণবিক বর্ধিত কাউন্টার হিসাবে ব্যবহৃত হয় এবং এটি পূর্ণসংখ্যার প্রতিস্থাপন হিসাবে ব্যবহার করা যায় না। তবে, এই শ্রেণিটি সংখ্যার ভিত্তিক শ্রেণীর সাথে কাজ করে এমন সরঞ্জাম এবং ইউটিলিটিগুলির দ্বারা অভিন্ন অ্যাক্সেসের অনুমতি দেওয়ার জন্য সংখ্যা বাড়িয়ে দেয়।
আমরা প্রদর্শিত হিসাবে সেগুলি ব্যবহার করতে পারি:
final Map<String,AtomicInteger> map2 = new ConcurrentHashMap<>();
map2.putIfAbsent("A",new AtomicInteger(0));
map2.putIfAbsent("B",new AtomicInteger(0)); //[A=0, B=0]
map2.get("B").incrementAndGet(); //[A=0, B=1]
একটি বিষয় লক্ষ্য করার জন্য আমরা getকীটির জন্য মানটি পেতে অনুরোধ করছি Bএবং এরপরে incrementAndGet()অবশ্যই এটির মানটি চাচ্ছি যা অবশ্যই AtomicInteger। পদ্ধতিটি putIfAbsentইতিমধ্যে উপস্থিত থাকলে কীটির মান ফেরত দেয় বলে আমরা এটি অনুকূল করতে পারি :
map2.putIfAbsent("B",new AtomicInteger(0)).incrementAndGet();//[A=0, B=2]
একটি পার্শ্ব নোট যদি আমরা ব্যবহার করার পরিকল্পনা উপর AtomicLong উচ্চ বিবাদের থ্রুপুট প্রত্যাশিত অধীনে প্রতি ডকুমেন্টেশন যেমন তারপর LongAdder উচ্চতর স্থান খরচ ব্যয় উল্লেখযোগ্যভাবে বেশি। এই প্রশ্নটি পরীক্ষা করে দেখুন ।