1) CopyOnWriteArraySet
এটি একটি বেশ সহজ বাস্তবায়ন - এটির মূলত একটি অ্যারেতে উপাদানগুলির একটি তালিকা থাকে এবং তালিকাটি পরিবর্তন করার সময় এটি অ্যারের অনুলিপি করে। পাঠক এবং লেখকদের মধ্যে সমন্বয় সাধনের প্রয়োজনীয়তা এড়িয়ে (বর্তমানে লেখাকে নিজেই সিঙ্ক্রোনাইজ করা দরকার) - এই সময়ে চলমান আইট্রেটিস এবং অন্যান্য অ্যাক্সেসগুলি পুরানো অ্যারের সাথে অবিরত রয়েছে। সাধারণত দ্রুত সেট অপারেশনগুলি (বিশেষত contains()
) এখানে বেশ ধীর গতির হয়, কারণ অ্যারেগুলি লিনিয়ার সময়ে অনুসন্ধান করা হবে।
এটি কেবলমাত্র ছোট সেটগুলির জন্য ব্যবহার করুন যা প্রায়শই পড়বে (পুনরাবৃত্তি হবে) এবং খুব কমই পরিবর্তিত হবে। (শোনার শ্রোতা-সেটগুলি উদাহরণ হতে পারে, তবে এগুলি প্রকৃতপক্ষে সেট নয় এবং এটি কেবল ইডিটি থেকে ব্যবহার করা উচিত))
2) Collections.synchronizedSet
মূল সেটটির প্রতিটি পদ্ধতির চারপাশে কেবল একটি সিঙ্ক্রোনাইজড-ব্লক মোড়ানো হবে। আপনার সরাসরি আসল সেটটি অ্যাক্সেস করা উচিত নয়। এর অর্থ হ'ল সেটটির কোনও দুটি পদ্ধতি একই সাথে সম্পাদন করা যাবে না (অন্যটি শেষ না হওয়া অবধি একটি ব্লক করবে) - এটি থ্রেড-নিরাপদ, তবে যদি একাধিক থ্রেড সত্যিই সেটটি ব্যবহার করে থাকে তবে আপনার সম্মতি থাকবে না। যদি আপনি পুনরুক্তি ব্যবহার করে থাকেন তবে পুনরাবৃত্তকারী কলগুলির মধ্যে সেটটি সংশোধন করার সময় আপনার সাধারণত কনকেনারমোডিফিকেশন অনুভূতিগুলি এড়াতে বাহ্যিকভাবে সিঙ্ক্রোনাইজ করতে হবে। পারফরম্যান্সটি আসল সেটটির পারফরম্যান্সের মতো হবে (তবে কিছু সংশ্লেষনের ওভারহেড সহ, এবং যদি একই সাথে ব্যবহার করা হয় তবে ব্লক করা হবে)।
আপনার যদি কেবল স্বল্প সামঞ্জস্য থাকে এবং এটি নিশ্চিত করতে চান যে সমস্ত পরিবর্তনগুলি অন্যান্য থ্রেডের সাথে সাথেই দৃশ্যমান।
3) ও (লগ এন) এর বেশিরভাগ বুনিয়াদি ক্রিয়াকলাপ সহ ConcurrentSkipListSet
একযোগে SortedSet
বাস্তবায়ন। এটি একযোগে যুক্ত / অপসারণ এবং পড়ার / পুনরাবৃত্তির অনুমতি দেয়, যেখানে পুনরাবৃত্তি পুনরুক্তিটি তৈরি হওয়ার পর থেকে পরিবর্তনগুলি সম্পর্কে বলতে বা নাও বলতে পারে। বাল্ক অপারেশনগুলি কেবল একাধিক একক কল, এবং পরমাণুভাবে নয় - অন্যান্য থ্রেডগুলি কেবল তাদের কয়েকটি পর্যবেক্ষণ করতে পারে।
স্পষ্টতই আপনি এটি ব্যবহার করতে পারেন কেবল যদি আপনার উপাদানগুলিতে কিছু মোট অর্ডার থাকে। এটি উচ্চ-সহনীয় পরিস্থিতিতে, খুব বেশি সংখ্যক বড় সেট (ও (লগ এন) এর কারণে) জন্য আদর্শ প্রার্থীর মতো দেখাচ্ছে।
4) ConcurrentHashMap
(এবং এটি থেকে উত্পন্ন সেট) এর জন্য: এখানে সর্বাধিক প্রাথমিক বিকল্পগুলি hashCode()
হ্যাশম্যাপ / এর মতো ও (1) এ (তবে আপনার যদি ভাল এবং দ্রুত থাকে তবে) (তবে ও (এন) এর অধঃপতন হতে পারে) are HashSet। লেখার জন্য একটি সীমাবদ্ধ চুক্তি রয়েছে (টেবিলটি বিভক্ত করা হয়েছে, এবং লেখার অ্যাক্সেস প্রয়োজনীয় পার্টিশনে সিঙ্ক্রোনাইজ করা হবে), যখন পঠনের অ্যাক্সেস পুরোপুরি নিজের এবং লেখার থ্রেডের সাথে সামঞ্জস্যপূর্ণ (তবে সম্ভবত বর্তমানে পরিবর্তনের ফলাফলগুলি দেখতে পাবে না) লিখিত)। পুনরুক্তিকারীটি তৈরি হওয়ার পর থেকে পরিবর্তনগুলি দেখতে পারে এবং নাও দেখতে পারে এবং বাল্ক অপারেশনগুলি পারমাণবিক নয়। আকার পরিবর্তন ধীর (হ্যাশম্যাপ / হ্যাশসেট হিসাবে), সুতরাং এটি তৈরির প্রয়োজনীয় আকারটি নির্ধারণ করে এটিকে এড়িয়ে চলার চেষ্টা করুন (এবং এর প্রায় 1/3 অংশ ব্যবহার করুন, 3/4 পূর্ণ হওয়ার পরে এটি আকার পরিবর্তন করে)।
আপনার যখন বড় সেট থাকে, একটি ভাল (এবং দ্রুত) হ্যাশ ফাংশন থাকে তখন এটি ব্যবহার করুন এবং মানচিত্র তৈরির আগে সেট আকার এবং প্রয়োজনীয় সংমিশ্রণের অনুমান করতে পারবেন।
৫) এখানে ব্যবহার করা যেতে পারে এমন আরও একসাথে মানচিত্রের প্রয়োগ রয়েছে?