কম্পিউটার টিউটোরিয়াল

জাভাতে Fail-Fast এবং Fail-Safe এর পার্থক্য

জাভা কালেকশনে ইটারেটর দুটি ধরনের হয়ে থাকতে পারে: 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 ভালো।

  1. জাভাতে Serialization এবং Externalization-এর পার্থক্য

  2. জাভাতে Iterator এবং Enumeration-এর পার্থক্য

  3. জাভাতে ArrayList এবং HashSet-এর পার্থক্য

  4. জাভাতে Iterator এবং ListIterator-এর পার্থক্য