জাভা কালেকশনে ইটারেটর দুটি ধরনের হয়ে থাকতে পারে: Fail-Fast এবং Fail-Safe। নিচে পার্থক্যগুলো টেবিল আকারে দেওয়া হলো:
| ক্রমিক নং | কী | Fail-Fast | Fail-Safe |
|---|---|---|---|
| ১ | এক্সেপশন | কালেকশনে যেকোনো পরিবর্তন (এড, রিমুভ, আপডেট) হলে থ্রেড ইটারেট করছিলে ConcurrentModificationException থ্রো করে। |
ফেইল-সেফ কলেকশন এক্সেপশন থ্রো করে না। |
| ২ | কলেকশন টাইপ | ArrayList, HashMap ইত্যাদি ফেইল-ফাস্ট ইটারেটর ব্যবহার করে। |
CopyOnWriteArrayList, ConcurrentHashMap ইত্যাদি ফেইল-সেফ ইটারেটর ব্যবহার করে। |
| ৩ | পারফরম্যান্স ও মেমরি | আসল কলেকশনের ওপর কাজ করে। এক্সট্রা মেমরি বা টাইম লাগে না। | কলেকশনের ক্লোন/কপির ওপর কাজ করে। টাইম ও মেমরির ওভারহেড থাকে। |
| ৪ | মডিফিকেশন | ইটারেশন চলাকালীন কলেকশন মডিফাই করা যাবে না। | ইটারেশন চলাকালীন কলেকশন মডিফাই করা যায়। |
ফেইল-সেফ উদাহরণ (ConcurrentHashMap)
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
public class FailSafeExample {
public static void main(String[] args) {
ConcurrentHashMap map = new ConcurrentHashMap<>();
map.put("Dell", 1);
map.put("IBM", 2);
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
System.out.println(key + " : " + map.get(key));
map.put("Google", 3); // ইটারেশন চলাকালীন মডিফিকেশন
}
}
}
আউটপুট
IBM : 2 Dell : 1
ব্যাখ্যা: "Google" অ্যাড হয়েছে কিন্তু ইটারেটরে দেখายনি (স্ন্যাপশটের ওপর ইটারেট করছে)। এক্সেপশনও হয়নি।
ফেইল-ফাস্ট উদাহরণ (ArrayList)
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class FailFastExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator it = list.iterator();
while (it.hasNext()) {
Integer integer = it.next();
list.add(4); // ইটারেশন চলাকালীন মডিফিকেশন
}
}
}
আউটপুট
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
সিদ্ধান্ত: মাল্টিথ্রেডেড এনভায়রনমেন্টে বা ইটারেশন চলাকালীন মডিফিকেশন দরকার হলে Fail-Safe (ConcurrentHashMap, CopyOnWriteArrayList) ব্যবহার করুন। সিঙ্গেল থ্রেডে পারফরম্যান্সের জন্য Fail-Fast ভালো।