Atomicity কি?
Atomicity একটি প্রোগ্রামের এমন বৈশিষ্ট্য যা নিশ্চিত করে যে একটি অপারেশন বা ট্রানজেকশন হয় সম্পূর্ণরূপে এক্সিকিউট হবে অথবা একেবারে হবে না।
এটি "সব অথবা কিছুই নয়" নীতির উপর ভিত্তি করে কাজ করে।
জাভার কনকারেন্সি মডেলে, atomicity নিশ্চিত করে যে একাধিক থ্রেড যখন একই ডেটার উপর কাজ করে, তখন অপারেশনগুলো partial update না করে সম্পূর্ণ সঠিকভাবে কাজ করে।
উদাহরণ: Non-Atomic অপারেশন
ধরা যাক, একটি শেয়ার্ড ইন্টিজার ভেরিয়েবল counter রয়েছে এবং দুটি থ্রেড এটি ইনক্রিমেন্ট করতে চায়। নিচের কোডটি দেখুন:
public class Counter {
private int counter = 0;
public void increment() {
counter++;
}
public int getCounter() {
return counter;
}
}
এই কোডে counter++ আসলে তিনটি ধাপ সম্পন্ন করে:
- ভেরিয়েবলের বর্তমান মান পড়া (
load). - একটি মান যোগ করা (
add). - ফলাফলটি পুনরায় লিখে ফেলা (
store).
যদি দুটি থ্রেড একই সময়ে এই অপারেশনটি এক্সিকিউট করে, তবে তারা একই মান পড়তে পারে এবং একে অপরের আপডেট ওভাররাইট করে। ফলে counter সঠিকভাবে ইনক্রিমেন্ট হয় না।
Atomicity-এর প্রয়োজনীয়তা
- ডেটা ইন্টিগ্রিটি রক্ষা করা:
শেয়ার্ড ডেটার উপর থ্রেডগুলোর একযোগে অ্যাক্সেসের ফলে ডেটা ইনকনসিস্টেন্সি হতে পারে। Atomicity নিশ্চিত করে যে প্রতিটি থ্রেড একটি শেয়ার্ড রিসোর্সে সম্পূর্ণ অপারেশন চালাতে পারবে। - Race Condition প্রতিরোধ করা:
একাধিক থ্রেডের মধ্যে সমান্তরাল অ্যাক্সেসের ফলে ডেটার আপডেট ভুল হতে পারে। Atomicity এটি প্রতিরোধ করে। - Deadlock মুক্ত:
Atomicity নিশ্চিত করলে ডেটা আপডেট করার সময় Deadlock এর ঝুঁকি কম থাকে। - Thread Safety নিশ্চিত করা:
শেয়ার্ড রিসোর্সের সঠিক ব্যবহারের জন্য Atomicity অপরিহার্য। এটি নিশ্চিত করে যে একাধিক থ্রেড ডেটার উপর একযোগে কাজ করলে সমস্যা হবে না।
Atomicity কিভাবে নিশ্চিত করা যায়?
১. Atomic Classes ব্যবহার করে
জাভাতে java.util.concurrent.atomic প্যাকেজ সরবরাহ করা হয়েছে, যা Thread-safe এবং atomicity নিশ্চিত করে।
যেমন, AtomicInteger, AtomicLong, AtomicReference ইত্যাদি।
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicExample {
private AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
public int getCounter() {
return counter.get();
}
public static void main(String[] args) {
AtomicExample example = new AtomicExample();
example.increment();
System.out.println("Counter: " + example.getCounter());
}
}
ব্যাখ্যা:
AtomicInteger.incrementAndGet()একক ধাপে মান বৃদ্ধি করে। এটি সম্পূর্ণ Atomic Operation।
২. Synchronized ব্লক ব্যবহার করে
Synchronized ব্যবহার করলে এক সময়ে শুধুমাত্র একটি থ্রেড শেয়ার্ড রিসোর্স অ্যাক্সেস করতে পারে। এটি atomicity নিশ্চিত করতে সাহায্য করে।
public class SynchronizedExample {
private int counter = 0;
public synchronized void increment() {
counter++;
}
public synchronized int getCounter() {
return counter;
}
}
ব্যাখ্যা:
synchronizedব্লক নিশ্চিত করে যেincrement()অপারেশন চলাকালীন অন্য কোনো থ্রেড রিসোর্সে অ্যাক্সেস করতে পারবে না।
৩. Lock এবং ReentrantLock ব্যবহার করে
java.util.concurrent.locks.Lock ইন্টারফেস ব্যবহার করে atomicity নিশ্চিত করা যায়। এটি synchronized-এর তুলনায় আরো নমনীয়।
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockExample {
private int counter = 0;
private Lock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
counter++;
} finally {
lock.unlock();
}
}
public int getCounter() {
return counter;
}
}
ব্যাখ্যা:
lock.lock()শেয়ার্ড রিসোর্সে অ্যাক্সেস ব্লক করে, এবংlock.unlock()তা মুক্ত করে।
Atomicity এবং Performance
- Performance Trade-off:
Atomicity নিশ্চিত করার জন্য সিঙ্ক্রোনাইজেশন বা লকিং ব্যবহার করলে পারফরম্যান্স কমে যেতে পারে। এটি বিশেষত উচ্চ কনকারেন্সি পরিস্থিতিতে গুরুত্বপূর্ণ। - Optimized Solutions:
Atomic classes (যেমনAtomicInteger) লাইটওয়েট এবং পারফরম্যান্সের জন্য উপযুক্ত কারণ এগুলো লক-ফ্রি।
Atomicity নিশ্চিত করার সেরা উপায়
- ছোট এবং নির্দিষ্ট অপারেশনগুলির জন্য
Atomicক্লাস ব্যবহার করা ভালো। - বড় এবং জটিল অপারেশনগুলির জন্য
synchronizedবাLockব্যবহার করতে পারেন। - স্পিন-লক বা রিডার-রাইটার লক ব্যবহার করলে পারফরম্যান্স উন্নত হতে পারে।
Atomicity হল জাভা কনকারেন্সির একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা ডেটার সঠিকতা এবং থ্রেড সেফটি নিশ্চিত করে। এটি ব্যবহারে ডেটার ইনকনসিস্টেন্সি, রেস কন্ডিশন, এবং অন্যান্য কনকারেন্সি সমস্যা এড়ানো যায়। Atomic Classes, synchronized, এবং Lock-এর মতো কৌশলগুলোর মাধ্যমে এটি সহজেই নিশ্চিত করা সম্ভব।
Read more