ArrayBlockingQueue এবং LinkedBlockingQueue উভয়ই BlockingQueue ইন্টারফেসের ইমপ্লিমেন্টেশন, যা Producer-Consumer Problem এর মতো সিঙ্ক্রোনাইজড ডেটা এক্সচেঞ্জ ব্যবস্থাপনা করতে ব্যবহৃত হয়। তবে এদের মধ্যে উল্লেখযোগ্য কিছু পার্থক্য রয়েছে।
১. ArrayBlockingQueue
- সারাংশ:
- এটি একটি নির্দিষ্ট আকারের fixed-size array ব্যবহার করে তৈরি করা হয়।
- FIFO (First In, First Out) পদ্ধতি অনুসরণ করে।
- এর আকার আগে থেকে নির্ধারিত হতে হয় এবং এটি পরে পরিবর্তন করা যায় না।
- সিঙ্ক্রোনাইজেশন:
- পুরো queue একটি single lock দ্বারা সিঙ্ক্রোনাইজ হয়।
- একই সময়ে শুধু একটি থ্রেড queue এর সাথে কাজ করতে পারে।
- পারফরম্যান্স:
- একাধিক প্রোডিউসার এবং কনজিউমার থাকলে এটি তুলনামূলক ধীর হতে পারে, কারণ একসাথে কাজ করার অনুমতি নেই।
- ব্যবহার:
- সীমিত মেমোরি বা নির্দিষ্ট আকারের queue প্রয়োজন হলে।
কোড উদাহরণ:
import java.util.concurrent.ArrayBlockingQueue; public class ArrayBlockingQueueExample { public static void main(String[] args) throws InterruptedException { ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3); queue.put(1); queue.put(2); queue.put(3); System.out.println(queue.take()); // 1 System.out.println(queue.take()); // 2 } }
২. LinkedBlockingQueue
- সারাংশ:
- এটি একটি লিঙ্কড লিস্ট ভিত্তিক queue যা linked nodes ব্যবহার করে।
- এর আকার সীমিত বা অসীম (default) হতে পারে।
- FIFO পদ্ধতি অনুসরণ করে।
- সিঙ্ক্রোনাইজেশন:
- প্রোডিউসার এবং কনজিউমারদের জন্য দুটি separate locks ব্যবহার করে।
- এটি একাধিক থ্রেডকে একই সময়ে কাজ করার অনুমতি দেয় (একটি ডেটা যোগ করছে, অন্যটি সরাচ্ছে)।
- পারফরম্যান্স:
- তুলনামূলকভাবে ভালো পারফরম্যান্স দেয়, বিশেষ করে একাধিক প্রোডিউসার এবং কনজিউমার থাকলে।
- ব্যবহার:
- যদি queue এর আকার সীমাহীন হওয়ার প্রয়োজন হয় অথবা একাধিক প্রোডিউসার এবং কনজিউমার একসাথে কাজ করবে।
কোড উদাহরণ:
import java.util.concurrent.LinkedBlockingQueue; public class LinkedBlockingQueueExample { public static void main(String[] args) throws InterruptedException { LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(); queue.put(1); queue.put(2); queue.put(3); System.out.println(queue.take()); // 1 System.out.println(queue.take()); // 2 } }
তুলনামূলক পার্থক্য টেবিল
| বৈশিষ্ট্য | ArrayBlockingQueue | LinkedBlockingQueue |
|---|---|---|
| স্টোরেজ ডেটা স্ট্রাকচার | Array (ফিক্সড আকার) | Linked List (লিঙ্কড নোড) |
| ডিফল্ট আকার | প্রয়োজনীয় | অসীম (Integer.MAX_VALUE) |
| সিঙ্ক্রোনাইজেশন লক | Single Lock | Separate Locks for Producer & Consumer |
| পারফরম্যান্স | তুলনামূলক ধীর | তুলনামূলক দ্রুত |
| মেমোরি ব্যবস্থাপনা | পূর্বনির্ধারিত (Fixed Size) | ডায়নামিক (Dynamic Allocation) |
| উপযুক্ত ক্ষেত্রে | সীমিত queue প্রয়োজন হলে | অনেক প্রোডিউসার এবং কনজিউমার থাকলে |
বুঝতে হবে:
ArrayBlockingQueueযখন queue-এর আকার আগে থেকেই জানা থাকে এবং মেমোরি স্থিতিশীল রাখতে হয়, তখন ব্যবহৃত হয়।LinkedBlockingQueueযেখানে queue-এর আকার ডায়নামিক হতে পারে এবং একাধিক প্রোডিউসার/কনজিউমার সমান্তরাল কাজ করবে, সেখানে ব্যবহৃত হয়।
উদাহরণ:
ArrayBlockingQueue:সীমিত ক্যাশে বা ব্যান্ডউইথ ব্যবহার করার জন্য।LinkedBlockingQueue:লগ মেসেজ প্রসেসিং বা বড় ডেটা স্ট্রিমিং এর জন্য।
এটি ব্যবহারকারীর নির্দিষ্ট প্রয়োজনীয়তা অনুযায়ী নির্বাচন করা উচিত।
Content added By
Read more