জাভাতে Concurrent Collections এমন ডেটা স্ট্রাকচার, যা সমান্তরাল পরিবেশে (concurrent environments) সঠিক ও কার্যকরভাবে কাজ করতে সক্ষম। এগুলো java.util.concurrent প্যাকেজের অন্তর্ভুক্ত এবং থ্রেড-সেফ ডেটা ম্যানিপুলেশন নিশ্চিত করতে ব্যবহৃত হয়।
Concurrent Collections এর ধারণা
- Concurrent Collections হলো ডেটা স্ট্রাকচার যা কনকারেন্ট অ্যাক্সেস (multiple threads accessing the same data structure) এবং সিঙ্ক্রোনাইজেশন পরিচালনা করে।
- সাধারণ
CollectionবাMapইন্টারফেসের বিকল্প হিসেবে এগুলো তৈরি করা হয়েছে, যেখানে সাধারণsynchronizedব্লকের পরিবর্তে অভ্যন্তরীণ লকিং মেকানিজম ব্যবহৃত হয়। - এগুলো স্পিন-লক, রিড-ওপ্টিমাইজেশন এবং অন্যান্য উন্নত টেকনিক ব্যবহার করে কর্মদক্ষতা বৃদ্ধি করে।
Concurrent Collections এর প্রয়োজনীয়তা
- থ্রেড সেফ অপারেশন:
- কনকারেন্ট পরিবেশে ডেটার অখণ্ডতা বজায় রাখতে।
- ডেটা রেস এবং ডেডলকের ঝুঁকি কমায়।
- উচ্চ কর্মদক্ষতা:
- কম লকিং ও ভালো পারফরম্যান্সের জন্য উন্নত লক-ফ্রি বা কম-লকিং প্রযুক্তি ব্যবহার করে।
- ডেডলক এবং রেস কন্ডিশন প্রতিরোধ:
- বিভিন্ন থ্রেডের মাধ্যমে একসাথে অ্যাক্সেসের সময় জটিল সমস্যা এড়ানো।
- সহজ ইমপ্লিমেন্টেশন:
- থ্রেড সেফ ডেটা স্ট্রাকচার ব্যবহারে ডেভেলপারদের জন্য কোড লেখার প্রক্রিয়া সহজ করে।
Concurrent Collections এর উদাহরণ
১. ConcurrentHashMap
- থ্রেড সেফ
HashMapযাsynchronizedব্লক ছাড়াই কাজ করে। - সেগমেন্টেড লকিং ব্যবহার করে শুধুমাত্র সংশ্লিষ্ট অংশ লক করে, ফলে পারফরম্যান্স ভালো হয়।
ব্যবহার:
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapExample {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
// ডেটা যুক্ত করা
map.put("A", 1);
map.put("B", 2);
// থ্রেড ১: মান পরিবর্তন
Thread t1 = new Thread(() -> {
map.put("C", 3);
System.out.println("Thread 1 added: " + map);
});
// থ্রেড ২: মান অ্যাক্সেস করা
Thread t2 = new Thread(() -> {
System.out.println("Thread 2 accessed: " + map.get("B"));
});
t1.start();
t2.start();
}
}
২. CopyOnWriteArrayList
- থ্রেড সেফ
ArrayList, যা প্রতিবার নতুন সংস্করণ তৈরি করে ডেটা অ্যাড/রিমুভ করে। - রিড-অপ্টিমাইজড ডেটা স্ট্রাকচার।
ব্যবহার:
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteArrayListExample {
public static void main(String[] args) {
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("A");
list.add("B");
// থ্রেড ১: নতুন ডেটা যুক্ত করা
Thread t1 = new Thread(() -> {
list.add("C");
System.out.println("Thread 1 added: " + list);
});
// থ্রেড ২: রিড অপারেশন
Thread t2 = new Thread(() -> {
for (String item : list) {
System.out.println("Thread 2 read: " + item);
}
});
t1.start();
t2.start();
}
}
৩. ConcurrentLinkedQueue
- থ্রেড সেফ
Queueযা নন-ব্লকিং ডেটা স্ট্রাকচার হিসেবে কাজ করে। - FIFO (First-In-First-Out) অর্ডারে কাজ করে।
ব্যবহার:
import java.util.concurrent.ConcurrentLinkedQueue;
public class ConcurrentLinkedQueueExample {
public static void main(String[] args) {
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
// ডেটা যুক্ত করা
queue.add("A");
queue.add("B");
// থ্রেড ১: নতুন ডেটা যুক্ত করা
Thread t1 = new Thread(() -> {
queue.add("C");
System.out.println("Thread 1 added: " + queue);
});
// থ্রেড ২: ডেটা পোল করা
Thread t2 = new Thread(() -> {
String item = queue.poll();
System.out.println("Thread 2 polled: " + item);
});
t1.start();
t2.start();
}
}
৪. BlockingQueue
- একটি
Queueযা থ্রেডের মধ্যে ডেটা শেয়ার করার জন্য ব্লকিং মেকানিজম ব্যবহার করে। - প্রযোজ্য: প্রোডিউসার-ডিফিউসার প্যাটার্ন।
ব্যবহার:
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueExample {
public static void main(String[] args) {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
// প্রোডিউসার থ্রেড
Thread producer = new Thread(() -> {
try {
queue.put("A");
System.out.println("Produced: A");
queue.put("B");
System.out.println("Produced: B");
queue.put("C");
System.out.println("Produced: C");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// কনজিউমার থ্রেড
Thread consumer = new Thread(() -> {
try {
Thread.sleep(1000); // কিছুক্ষণ অপেক্ষা
System.out.println("Consumed: " + queue.take());
System.out.println("Consumed: " + queue.take());
System.out.println("Consumed: " + queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
});
producer.start();
consumer.start();
}
}
Concurrent Collections এর গুরুত্বপূর্ণ ক্লাসসমূহ
| ক্লাসের নাম | ব্যবহার |
|---|---|
ConcurrentHashMap | থ্রেড সেফ HashMap |
CopyOnWriteArrayList | থ্রেড সেফ ArrayList |
CopyOnWriteArraySet | থ্রেড সেফ Set |
ConcurrentLinkedQueue | নন-ব্লকিং থ্রেড সেফ Queue |
BlockingQueue | প্রোডিউসার-ডিফিউসার প্যাটার্নে ব্লকিং মেকানিজম সমর্থনকারী Queue |
ConcurrentSkipListMap | থ্রেড সেফ SortedMap |
ConcurrentSkipListSet | থ্রেড সেফ SortedSet |
Concurrent Collections এর সুবিধা
- থ্রেড সেফ:
- এগুলো থ্রেড সেফ এবং ডেটার সঠিকতা বজায় রাখে।
- উচ্চ পারফরম্যান্স:
- লক-ফ্রি এবং কম-লকিং অপারেশন নিশ্চিত করে।
- সহজ ব্যবহার:
- ম্যানুয়াল সিঙ্ক্রোনাইজেশন না করেও থ্রেড সেফ ডেটা ম্যানেজ করা যায়।
- বিস্তৃত অ্যাপ্লিকেশন:
- ডেটা শেয়ারিং, প্রোডিউসার-ডিফিউসার প্যাটার্ন, এবং থ্রেড কনট্রোল সিস্টেমে ব্যবহৃত হয়।
Concurrent Collections থ্রেড সেফ প্রোগ্রামিংয়ে উন্নত কার্যকারিতা এবং স্থিতিশীলতা নিশ্চিত করতে অপরিহার্য। এদের ব্যবহার সমান্তরাল পরিবেশে প্রোগ্রামিং আরও সহজ এবং কার্যকর করে তোলে।
Content added By
Read more