জাভা কনকারেন্সি ফ্রেমওয়ার্কে মাল্টিথ্রেডেড প্রোগ্রামিংয়ের সময় সাধারণ ডেটা স্ট্রাকচারগুলি নিরাপদে ব্যবহারের জন্য এই ক্লাসগুলি গুরুত্বপূর্ণ ভূমিকা পালন করে।
১. 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: প্রযোজক-গ্রাহক প্যাটার্নে ব্যবহৃত কিউ যা ব্লকিং মেকানিজম সমর্থন করে।
এই ক্লাসগুলো সঠিকভাবে ব্যবহার করলে মাল্টিথ্রেডেড প্রোগ্রামিং সহজ এবং কার্যকর করা সম্ভব।
Read more