AtomicStampedReference এবং AtomicMarkableReference হল Java-এর java.util.concurrent.atomic প্যাকেজের অংশ। এই দুটি ক্লাস ব্যবহার করে মাল্টি-থ্রেডিংয়ের সময় শেয়ার করা রেফারেন্সের উপর সুনির্দিষ্ট এবং থ্রেড-সেফ অপারেশন পরিচালনা করা যায়। এরা CAS (Compare-And-Swap) মেকানিজম ব্যবহার করে এবং অতিরিক্ত তথ্য (স্ট্যাম্প বা মার্ক) সংরক্ষণ করে, যা ডেটার সঠিকতা নিশ্চিত করতে সাহায্য করে।
AtomicStampedReference
AtomicStampedReference একটি রেফারেন্সের (object reference) পাশাপাশি একটি স্ট্যাম্প মান সংরক্ষণ করে। এটি মূলত ABA সমস্যা সমাধানের জন্য ব্যবহৃত হয়।
ABA সমস্যা কী?
ABA সমস্যা ঘটে যখন একটি রেফারেন্সের মান পরিবর্তন হয় এবং আবার আগের মানে ফিরে আসে, কিন্তু এই পরিবর্তনটি অন্যান্য থ্রেড শনাক্ত করতে পারে না।
AtomicStampedReference একটি স্ট্যাম্প বা কাউন্টার ব্যবহার করে, যা প্রতিটি পরিবর্তনের সাথে আপডেট হয়। এটি নিশ্চিত করে যে রেফারেন্সটি আগের মতো দেখালেও এর স্ট্যাম্প ভিন্ন হলে পরিবর্তন শনাক্ত করা যায়।
AtomicStampedReference এর মেথডসমূহ
getReference(): রেফারেন্স রিটার্ন করে।getStamp(): বর্তমান স্ট্যাম্প রিটার্ন করে।compareAndSet(expectedReference, newReference, expectedStamp, newStamp):
যদি রেফারেন্স এবং স্ট্যাম্প উভয়ই প্রত্যাশিত মানের সাথে মেলে, তবে নতুন রেফারেন্স এবং স্ট্যাম্প সেট করে।set(newReference, newStamp): নতুন রেফারেন্স এবং স্ট্যাম্প সেট করে।
AtomicStampedReference উদাহরণ
import java.util.concurrent.atomic.AtomicStampedReference;
public class AtomicStampedReferenceExample {
public static void main(String[] args) {
// রেফারেন্স এবং স্ট্যাম্প সেট করা
String initialReference = "Initial";
int initialStamp = 0;
AtomicStampedReference<String> atomicStampedRef = new AtomicStampedReference<>(initialReference, initialStamp);
// রেফারেন্স এবং স্ট্যাম্প পড়া
System.out.println("Reference: " + atomicStampedRef.getReference());
System.out.println("Stamp: " + atomicStampedRef.getStamp());
// Compare and Set অপারেশন
boolean success = atomicStampedRef.compareAndSet("Initial", "Updated", 0, 1);
System.out.println("Update Success: " + success);
System.out.println("New Reference: " + atomicStampedRef.getReference());
System.out.println("New Stamp: " + atomicStampedRef.getStamp());
}
}
আউটপুট:
Reference: Initial
Stamp: 0
Update Success: true
New Reference: Updated
New Stamp: 1
AtomicMarkableReference
AtomicMarkableReference একটি রেফারেন্সের পাশাপাশি একটি মার্ক (boolean flag) মান সংরক্ষণ করে। এটি সাধারণত এমন ক্ষেত্রে ব্যবহৃত হয় যেখানে একটি নির্দিষ্ট অবস্থা (marked বা unmarked) ট্র্যাক করতে হয়।
AtomicMarkableReference এর মেথডসমূহ
getReference(): রেফারেন্স রিটার্ন করে।isMarked(): বর্তমান মার্ক স্টেট রিটার্ন করে।compareAndSet(expectedReference, newReference, expectedMark, newMark):
যদি রেফারেন্স এবং মার্ক উভয়ই প্রত্যাশিত মানের সাথে মেলে, তবে নতুন রেফারেন্স এবং মার্ক সেট করে।set(newReference, newMark): নতুন রেফারেন্স এবং মার্ক সেট করে।
AtomicMarkableReference উদাহরণ
import java.util.concurrent.atomic.AtomicMarkableReference;
public class AtomicMarkableReferenceExample {
public static void main(String[] args) {
// রেফারেন্স এবং মার্ক সেট করা
String initialReference = "Initial";
boolean initialMark = false;
AtomicMarkableReference<String> atomicMarkableRef = new AtomicMarkableReference<>(initialReference, initialMark);
// রেফারেন্স এবং মার্ক পড়া
System.out.println("Reference: " + atomicMarkableRef.getReference());
System.out.println("Is Marked: " + atomicMarkableRef.isMarked());
// Compare and Set অপারেশন
boolean success = atomicMarkableRef.compareAndSet("Initial", "Updated", false, true);
System.out.println("Update Success: " + success);
System.out.println("New Reference: " + atomicMarkableRef.getReference());
System.out.println("New Mark: " + atomicMarkableRef.isMarked());
}
}
আউটপুট:
Reference: Initial
Is Marked: false
Update Success: true
New Reference: Updated
New Mark: true
AtomicStampedReference এবং AtomicMarkableReference এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | AtomicStampedReference | AtomicMarkableReference |
|---|---|---|
| অতিরিক্ত মান | স্ট্যাম্প (একটি ইন্টিজার)। | মার্ক (একটি বুলিয়ান)। |
| ব্যবহার ক্ষেত্র | ABA সমস্যা সমাধানে ব্যবহৃত। | অবস্থা ট্র্যাকিং বা ফ্ল্যাগ ম্যানেজমেন্টে ব্যবহৃত। |
| কমপ্লেক্সিটি | রেফারেন্স এবং স্ট্যাম্পের মান উভয়ই পরিবর্তন করতে হয়। | শুধুমাত্র রেফারেন্স এবং মার্ক পরিবর্তন। |
কেন ব্যবহার করবেন?
- AtomicStampedReference:
- ABA সমস্যা সমাধানের জন্য।
- যখন রেফারেন্সের প্রতিটি পরিবর্তন একটি নির্দিষ্ট সংখ্যা বা স্ট্যাম্প দিয়ে চিহ্নিত করা প্রয়োজন।
- AtomicMarkableReference:
- যখন একটি রেফারেন্সের সাথে একটি boolean flag সংরক্ষণ করতে হয়।
- অবস্থা বা স্টেট পরিবর্তন ট্র্যাক করার জন্য।
উপসংহার
AtomicStampedReference এবং AtomicMarkableReference মাল্টি-থ্রেডেড প্রোগ্রামে ডেটার সঠিকতা এবং নিরাপত্তা নিশ্চিত করার জন্য গুরুত্বপূর্ণ টুল।
- AtomicStampedReference ABA সমস্যা সমাধানে কার্যকর।
- AtomicMarkableReference রেফারেন্সের সাথে একটি boolean state ট্র্যাক করতে সহায়ক।
এই ক্লাসগুলো ব্যবহার করে মাল্টি-থ্রেডেড প্রোগ্রামিং আরও নির্ভরযোগ্য এবং কার্যকর করা সম্ভব।