ConcurrentHashMap, CopyOnWriteArrayList, এবং BlockingQueue এর ব্যবহার

Concurrent Collections - জাভা কনকারেন্সি (Java Concurrency) - Java Technologies

317

জাভা কনকারেন্সি ফ্রেমওয়ার্কে মাল্টিথ্রেডেড প্রোগ্রামিংয়ের সময় সাধারণ ডেটা স্ট্রাকচারগুলি নিরাপদে ব্যবহারের জন্য এই ক্লাসগুলি গুরুত্বপূর্ণ ভূমিকা পালন করে।


১. ConcurrentHashMap

ConcurrentHashMap হল একটি থ্রেড-সেফ সংস্করণ HashMap এর, যা একই সময়ে একাধিক থ্রেড থেকে ডেটা অ্যাক্সেস এবং আপডেট করতে দেয়। এটি লকিং কৌশল (bucket-level locking) ব্যবহার করে পারফরম্যান্স বাড়ায়।

ব্যবহার:

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();

        // মান যোগ করা
        map.put("One", 1);
        map.put("Two", 2);

        // মাল্টিথ্রেডিং ব্যবহার
        Thread thread1 = new Thread(() -> {
            map.put("Three", 3);
            System.out.println("Thread 1: " + map);
        });

        Thread thread2 = new Thread(() -> {
            map.put("Four", 4);
            System.out.println("Thread 2: " + map);
        });

        thread1.start();
        thread2.start();

        // শেষ ফলাফল
        System.out.println("Final Map: " + map);
    }
}

বৈশিষ্ট্য:

  • একাধিক থ্রেড ডেটা অ্যাক্সেস করতে পারে।
  • শুধুমাত্র প্রয়োজনীয় অংশে লকিং প্রয়োগ করে।

২. CopyOnWriteArrayList

CopyOnWriteArrayList হলো একটি থ্রেড-সেফ সংস্করণ ArrayList এর, যা মূলত রিড অপারেশন বেশি হলে ব্যবহৃত হয়। এটি প্রতিবার আপডেট করার সময় একটি নতুন কপি তৈরি করে।

ব্যবহার:

import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListExample {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();

        // মান যোগ করা
        list.add("One");
        list.add("Two");

        // মাল্টিথ্রেডিং ব্যবহার
        Thread thread1 = new Thread(() -> {
            list.add("Three");
            System.out.println("Thread 1: " + list);
        });

        Thread thread2 = new Thread(() -> {
            list.add("Four");
            System.out.println("Thread 2: " + list);
        });

        thread1.start();
        thread2.start();

        // রিড অপারেশন
        list.forEach(System.out::println);
    }
}

বৈশিষ্ট্য:

  • প্রতিবার রাইট অপারেশনের জন্য একটি নতুন কপি তৈরি করে।
  • রিড অপারেশনের সময় কোন লকিং প্রয়োজন হয় না।

৩. BlockingQueue

BlockingQueue হলো একটি থ্রেড-সেফ কিউ যা থ্রেড সিঙ্ক্রোনাইজেশনের জন্য ব্লকিং অপারেশন ব্যবহার করে। এটি প্রযোজক-গ্রাহক (Producer-Consumer) প্যাটার্নে ব্যবহৃত হয়।

ব্যবহার:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueExample {
    public static void main(String[] args) {
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(5);

        // প্রযোজক থ্রেড
        Thread producer = new Thread(() -> {
            try {
                for (int i = 1; i <= 5; i++) {
                    queue.put(i);
                    System.out.println("Produced: " + i);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // গ্রাহক থ্রেড
        Thread consumer = new Thread(() -> {
            try {
                while (true) {
                    Integer value = queue.take();
                    System.out.println("Consumed: " + value);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        producer.start();
        consumer.start();
    }
}

বৈশিষ্ট্য:

  • put() ব্লক করে যদি কিউ পূর্ণ হয়।
  • take() ব্লক করে যদি কিউ খালি হয়।
  • বিভিন্ন ইমপ্লিমেন্টেশন রয়েছে: ArrayBlockingQueue, LinkedBlockingQueue, ইত্যাদি।

সবগুলো একত্রে ব্যবহার: উদাহরণ

নিচে ConcurrentHashMap, CopyOnWriteArrayList, এবং BlockingQueue এর সম্মিলিত ব্যবহার দেখানো হলো:

import java.util.concurrent.*;

public class ConcurrencyExample {
    public static void main(String[] args) {
        // ConcurrentHashMap
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
        map.put("Initial", 0);

        // CopyOnWriteArrayList
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        list.add("Start");

        // BlockingQueue
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(5);

        // থ্রেড ১: মান যোগ করে
        Thread thread1 = new Thread(() -> {
            map.put("Thread1", 1);
            list.add("Thread1");
            try {
                queue.put("Message from Thread1");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // থ্রেড ২: মান যোগ করে
        Thread thread2 = new Thread(() -> {
            map.put("Thread2", 2);
            list.add("Thread2");
            try {
                queue.put("Message from Thread2");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // থ্রেড চালু করা
        thread1.start();
        thread2.start();

        // কিউ থেকে মেসেজ পড়া
        Thread thread3 = new Thread(() -> {
            try {
                while (true) {
                    String message = queue.take();
                    System.out.println("Consumed: " + message);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        thread3.start();
    }
}

  • ConcurrentHashMap: থ্রেড-সেফ ম্যাপ যেখানে একাধিক থ্রেড একসাথে ডেটা অ্যাক্সেস এবং আপডেট করতে পারে।
  • CopyOnWriteArrayList: থ্রেড-সেফ লিস্ট যেখানে রিড অপারেশনের জন্য দ্রুত কার্যকর এবং রাইট অপারেশনে একটি কপি তৈরি হয়।
  • BlockingQueue: প্রযোজক-গ্রাহক প্যাটার্নে ব্যবহৃত কিউ যা ব্লকিং মেকানিজম সমর্থন করে।

এই ক্লাসগুলো সঠিকভাবে ব্যবহার করলে মাল্টিথ্রেডেড প্রোগ্রামিং সহজ এবং কার্যকর করা সম্ভব।

Content added By
Promotion

Are you sure to start over?

Loading...