জাভাতে, java.util.concurrent.atomic প্যাকেজে থাকা AtomicInteger, AtomicBoolean, এবং AtomicReference ক্লাসগুলি কনকারেন্ট প্রোগ্রামিংয়ে রেস কন্ডিশন এড়াতে এবং থ্রেড সেফ অপারেশনগুলো করতে ব্যবহৃত হয়। এগুলো সাধারণত অ্যাটমিক অপারেশন (atomic operations) চালায়, যা একই সময়ে একাধিক থ্রেড দ্বারা অ্যাক্সেস করার সময় ডেটার অখণ্ডতা নিশ্চিত করে।
১. AtomicInteger
AtomicInteger একটি অ্যাটমিক ভেরিয়েবল যা শুধুমাত্র পূর্ণসংখ্যার মান ধারণ করে। এটি একাধিক থ্রেড দ্বারা থ্রেড সেফ ভাবে ইঙ্ক্রিমেন্ট, ডিক্রিমেন্ট এবং অন্যান্য গাণিতিক অপারেশন করতে সক্ষম।
ব্যবহার উদাহরণ:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerExample {
public static void main(String[] args) {
// AtomicInteger তৈরি
AtomicInteger atomicCounter = new AtomicInteger(0);
// একাধিক থ্রেডের মাধ্যমে মান ইনক্রিমেন্ট করা
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
atomicCounter.incrementAndGet(); // ইনক্রিমেন্ট এবং ফলস্বরূপ মান ফেরত
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
atomicCounter.incrementAndGet(); // ইনক্রিমেন্ট এবং ফলস্বরূপ মান ফেরত
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// থ্রেডগুলো শেষ হওয়ার পর কনসোলের মাধ্যমে ফলাফল প্রিন্ট করা
System.out.println("Final Counter Value: " + atomicCounter.get());
}
}
ব্যাখ্যা:
- এখানে,
AtomicIntegerক্লাসেরincrementAndGet()মেথড ব্যবহার করা হয়েছে। এটি ইনক্রিমেন্ট এবং মান ফেরত দেওয়ার অ্যাটমিক অপারেশন করে। - একাধিক থ্রেডের মাধ্যমে একসাথে মান আপডেট করা হলেও, এটি নিরাপদ এবং সঠিকভাবে কাজ করে।
২. AtomicBoolean
AtomicBoolean একটি অ্যাটমিক ভ্যালু ধারণকারী বুলিয়ান টাইপের ক্লাস, যা থ্রেড সেফ ফ্ল্যাগ পরিচালনার জন্য ব্যবহার করা হয়।
ব্যবহার উদাহরণ:
import java.util.concurrent.atomic.AtomicBoolean;
public class AtomicBooleanExample {
public static void main(String[] args) {
// AtomicBoolean তৈরি
AtomicBoolean flag = new AtomicBoolean(false);
// থ্রেড ১
Thread t1 = new Thread(() -> {
// যদি flag এর মান false হয় তবে সেটিকে true করা
if (flag.compareAndSet(false, true)) {
System.out.println("Thread 1: Flag was false, now set to true");
}
});
// থ্রেড ২
Thread t2 = new Thread(() -> {
// যদি flag এর মান false হয় তবে সেটিকে true করা
if (flag.compareAndSet(false, true)) {
System.out.println("Thread 2: Flag was false, now set to true");
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- এখানে,
AtomicBooleanক্লাসেরcompareAndSet()মেথড ব্যবহার করা হয়েছে। এটি একটি অ্যাটমিক অপারেশন যা প্রথমে বর্তমান মান চেক করে এবং যদি মানের সাথে মিলে যায়, তাহলে নতুন মান সেট করে। - এই কোডে, প্রথম থ্রেড
falseকেtrueতে পরিবর্তন করতে সক্ষম হবে, এবং দ্বিতীয় থ্রেড সেটি পরিবর্তন করতে পারবে না যদি প্রথম থ্রেড এটি ইতিমধ্যেই পরিবর্তন করে থাকে।
৩. AtomicReference
AtomicReference একটি জেনেরিক ক্লাস, যা একটি অ্যাটমিকভাবে রেফারেন্স (অবজেক্ট রেফারেন্স) ধারণ করতে ব্যবহৃত হয়। এটি বিভিন্ন থ্রেডের মধ্যে একসাথে অবজেক্ট রেফারেন্সের নিরাপদ আপডেট নিশ্চিত করে।
ব্যবহার উদাহরণ:
import java.util.concurrent.atomic.AtomicReference;
public class AtomicReferenceExample {
public static void main(String[] args) {
// AtomicReference তৈরি
AtomicReference<String> atomicString = new AtomicReference<>("Initial Value");
// থ্রেড ১
Thread t1 = new Thread(() -> {
String current = atomicString.get();
String updated = current + " Updated by Thread 1";
atomicString.compareAndSet(current, updated); // অ্যাটমিকভাবে মান পরিবর্তন
System.out.println("Thread 1 updated value: " + atomicString.get());
});
// থ্রেড ২
Thread t2 = new Thread(() -> {
String current = atomicString.get();
String updated = current + " Updated by Thread 2";
atomicString.compareAndSet(current, updated); // অ্যাটমিকভাবে মান পরিবর্তন
System.out.println("Thread 2 updated value: " + atomicString.get());
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Final Value: " + atomicString.get());
}
}
ব্যাখ্যা:
- এখানে,
AtomicReferenceব্যবহার করা হয়েছে যা একটি স্ট্রিং রেফারেন্স ধারণ করে।compareAndSet()মেথড ব্যবহার করে, এটি অ্যাটমিকভাবে রেফারেন্সের মান পরিবর্তন করতে সক্ষম হয়। - প্রথম থ্রেড এবং দ্বিতীয় থ্রেড একে অপরের মান আপডেট করতে চেষ্টা করবে, তবে অ্যাটমিক অপারেশন থ্রেড সেফ পরিবর্তন নিশ্চিত করবে।
সারাংশ
- AtomicInteger: অ্যাটমিকভাবে পূর্ণসংখ্যা মান পরিবর্তন করতে ব্যবহৃত হয় (যেমন: ইঙ্ক্রিমেন্ট, ডিক্রিমেন্ট)।
- AtomicBoolean: অ্যাটমিকভাবে বুলিয়ান মান পরিবর্তন করতে ব্যবহৃত হয় এবং ফ্ল্যাগ হিসেবে কাজ করে।
- AtomicReference: জেনেরিক ক্লাস যা একটি অবজেক্ট রেফারেন্স অ্যাটমিকভাবে পরিবর্তন করতে ব্যবহৃত হয়।
এই ক্লাসগুলির মাধ্যমে, আপনি একটি থ্রেড সেফ কনকারেন্ট প্রোগ্রাম তৈরি করতে পারবেন, যেখানে ডেটার অখণ্ডতা বজায় থাকে এবং রেস কন্ডিশন এড়ানো হয়।
Read more