Atomics এবং volatile keyword উভয়ই Java এবং অন্যান্য প্রোগ্রামিং ভাষায় মাল্টি-থ্রেডিং পরিবেশে ডেটা সঠিকতা এবং থ্রেড সেফটি নিশ্চিত করার জন্য ব্যবহৃত হয়, তবে তাদের কাজ করার পদ্ধতি এবং ব্যবহার কিছুটা আলাদা। Atomics ব্যবহার করে লক-মুক্ত (lock-free) ডেটা পরিচালনা করা সম্ভব, যেখানে volatile keyword মূলত একটি ভেরিয়েবলের মেমোরি আপডেট সঠিকভাবে সমস্ত থ্রেডে প্রপাগেট (propagate) করতে ব্যবহৃত হয়।
এখানে এই দুটি পদ্ধতির পার্থক্য এবং সম্পর্ক ব্যাখ্যা করা হবে।
Volatile Keyword কী?
volatile keyword একটি ভেরিয়েবলকে shared বা multi-threaded পরিবেশে সঠিকভাবে ব্যবহৃত হতে সাহায্য করে। যখন কোনো ভেরিয়েবলকে volatile হিসাবে চিহ্নিত করা হয়, তখন এটি জাভাতে নিম্নলিখিত সুবিধা প্রদান করে:
- Memory Visibility:
volatileভেরিয়েবল গুলি একটি থ্রেডের পরিবর্তন অন্য সমস্ত থ্রেডে তৎক্ষণাৎ দৃশ্যমান হয়। অর্থাৎ, যখন একটি থ্রেড কোনোvolatileভেরিয়েবলের মান পরিবর্তন করে, তখন সেটি অন্য সব থ্রেডে অবিলম্বে প্রপাগেট হয়। - No Caching:
volatileভেরিয়েবলটি ক্যাশে করা হয় না, ফলে থ্রেডে প্রক্রিয়াকৃত মান মূল মেমোরি থেকে সরাসরি পড়া হয়।
ব্যবহারের উদাহরণ:
public class VolatileExample {
private volatile boolean flag = false;
public void toggleFlag() {
flag = !flag;
}
public boolean getFlag() {
return flag;
}
}
এখানে, flag ভেরিয়েবলটি volatile হওয়ায়, যে কোন থ্রেড এটি পরিবর্তন করলে অন্য থ্রেডগুলি তা তৎক্ষণাৎ দেখতে পাবে।
Atomics কী?
Atomics হল Java এর java.util.concurrent.atomic প্যাকেজের একটি সেট ক্লাস যা atomic operations (অথবা অপারেশনগুলি যা অবিচ্ছেদ্য, এককভাবে সম্পন্ন হয়) সরবরাহ করে। Atomics lock-free programming-এর মাধ্যমে মাল্টি-থ্রেডেড অ্যাপ্লিকেশনগুলিতে thread safety নিশ্চিত করে।
Atomics API ডেটার পরিবর্তন করার জন্য compare-and-swap (CAS) অ্যালগরিদম ব্যবহার করে এবং নিশ্চিত করে যে, একাধিক থ্রেড ডেটার উপর একসাথে কাজ করার সময় কোনো race condition বা ডেটা দুর্নীতি হবে না।
ব্যবহারের উদাহরণ (AtomicInteger):
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicExample {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet(); // Atomic operation
}
public int getCount() {
return count.get();
}
}
এখানে, count ভেরিয়েবলটির মান একাধিক থ্রেডের মাধ্যমে atomicভাবে বাড়ানো হচ্ছে, এবং এটিকে incrementAndGet() মেথডের মাধ্যমে লক-মুক্তভাবে সুরক্ষিত করা হয়েছে।
Atomics এবং Volatile Keyword এর মধ্যে সম্পর্ক
1. Memory Visibility:
যেখানে volatile কেবল একটি ভেরিয়েবলের মান সমস্ত থ্রেডের জন্য দৃশ্যমান করতে ব্যবহৃত হয়, Atomics শুধু ডেটার দৃশ্যমানতা নয়, বরং একটি থ্রেডের দ্বারা ডেটার উপরে কোনো পরিবর্তন নিশ্চিত করার জন্য atomic operations চালিয়ে থাকে। volatile শুধুমাত্র read/write অপারেশন করতে সাহায্য করে, কিন্তু Atomics আরও শক্তিশালী এবং সুসংগঠিত atomic updates পরিচালনা করতে সক্ষম, যেমন ইনক্রিমেন্ট বা ডেক্রিমেন্ট, যা atomicভাবে হয়।
2. Thread Safety:
volatilekeyword কেবল মেমোরি ভিউ নিশ্চিত করে এবং কোনো ভেরিয়েবলের একক অবস্থান নিয়ন্ত্রণ করে। তবে এটি atomicity বা synchronization দেয় না, তাই একাধিক থ্রেড একসাথে একটিvolatileভেরিয়েবলের মান পরিবর্তন করলে race condition ঘটতে পারে।- Atomics সম্পূর্ণ থ্রেড সেফ, কারণ এটি প্রতিটি অপারেশনকে atomic হিসেবে সম্পাদন করে এবং lock-free থাকে। CAS (Compare-And-Swap) পদ্ধতি ব্যবহার করে Atomics নিশ্চিত করে যে, ডেটার পরিবর্তন একাধিক থ্রেড দ্বারা একযোগভাবে ঘটলেও সঠিকভাবে সম্পন্ন হবে।
3. Performance:
volatileসাধারণত কমপ্লেক্স বা লকিং ছাড়া স্ট্যাটিক মান আপডেট করতে ভালো কাজ করে, তবে এটি শুধুমাত্র ডেটার মান দেখতে (read) বা সেট (write) করতে ব্যবহৃত হয়।- Atomics, বিশেষ করে যখন সুনির্দিষ্ট atomic operations (যেমন ইনক্রিমেন্ট, ডেক্রিমেন্ট, অথবা তুলনা এবং সেট) প্রয়োজন, তখন এটি অনেক বেশি কার্যকর এবং performance-efficient হতে পারে।
volatile vs Atomics
| বৈশিষ্ট্য | volatile keyword | Atomics |
|---|---|---|
| মেমোরি ভিউ (Memory Visibility) | একটি থ্রেডে পরিবর্তিত মান অন্য থ্রেডে দৃশ্যমান করে। | atomic অপারেশন সম্পাদনের মাধ্যমে ডেটার দৃশ্যমানতা নিশ্চিত করে। |
| সিঙ্ক্রোনাইজেশন (Synchronization) | কোন সিঙ্ক্রোনাইজেশন সরবরাহ করে না। | CAS (Compare-And-Swap) ব্যবহার করে লক-মুক্ত সিঙ্ক্রোনাইজেশন সরবরাহ করে। |
| এটমিক অপারেশন (Atomic Operation) | শুধুমাত্র read/write অপারেশন। | Atomic increment, compare-and-swap, add অপারেশন। |
| থ্রেড সেফটি (Thread Safety) | থ্রেড সেফ নয়, race condition হতে পারে। | সম্পূর্ণ থ্রেড সেফ, race condition প্রতিরোধ করে। |
| পারফরম্যান্স (Performance) | দ্রুত এবং কম পারফরম্যান্স ওভারহেড। | কিছু ক্ষেত্রে বেশি পারফরম্যান্স ওভারহেড হতে পারে, তবে বড় সিস্টেমে এটি কার্যকর। |
উপসংহার
volatilekeyword সহজে মাল্টি-থ্রেডিং অ্যাপ্লিকেশনে memory visibility নিশ্চিত করতে ব্যবহার করা হয়, তবে এটি সম্পূর্ণভাবে thread-safety নিশ্চিত করে না।- Atomics API atomic operations নিশ্চিত করে, যা মাল্টি-থ্রেডিং প্রোগ্রামে thread safety এবং performance optimization প্রদান করে, বিশেষত যখন ডেটার উপর লক-মুক্ত atomic updates প্রয়োজন।
এটি বলা যেতে পারে যে, volatile শুধুমাত্র ডেটা আপডেটের দৃশ্যমানতা নিশ্চিত করতে ব্যবহৃত হয়, যেখানে Atomics সেই আপডেটগুলিকে atomicভাবে পরিচালনা করে, যাতে থ্রেড সেফটি এবং ডেটার সঠিকতা বজায় থাকে।