AtomicReferenceArray হল Java এর java.util.concurrent.atomic প্যাকেজের একটি ক্লাস, যা array of references (অবজেক্ট রেফারেন্স) এর উপর atomic operations সম্পাদন করার জন্য ব্যবহৃত হয়। এটি মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে thread-safe উপায়ে রেফারেন্স ভ্যালু পরিবর্তন এবং পরিচালনা করতে ব্যবহৃত হয়।
AtomicReferenceArray এর বৈশিষ্ট্য
- Thread Safety: একাধিক থ্রেড একই সময় একটি রেফারেন্স পরিবর্তন করার চেষ্টা করলেও ডেটা সঠিক থাকে।
- Immutable Array: অ্যারের দৈর্ঘ্য immutable অর্থাৎ একবার সেট করার পর পরিবর্তন করা যায় না।
- Atomicity: প্রতিটি অপারেশন atomic অর্থাৎ বিভাজ্য নয়, যা ডেটার সঠিকতা নিশ্চিত করে।
- Reference Management: এটি অ্যারের প্রতিটি রেফারেন্সের মান পৃথকভাবে এবং নিরাপদভাবে পরিচালনা করতে পারে।
কনস্ট্রাক্টর
AtomicReferenceArray দুটি প্রধান কনস্ট্রাক্টর প্রদান করে:
AtomicReferenceArray(int length):
নির্দিষ্ট আকারের একটি অ্যারে তৈরি করে, যেখানে প্রতিটি এলিমেন্ট শুরুতেnullথাকে।AtomicReferenceArray<String> atomicArray = new AtomicReferenceArray<>(5); // ৫ এলিমেন্টের অ্যারেAtomicReferenceArray(T[] array):
একটি বিদ্যমান অ্যারে থেকে নতুন AtomicReferenceArray তৈরি করে। বিদ্যমান অ্যারের পরিবর্তনগুলি নতুন অ্যারেতে প্রতিফলিত হয় না।String[] array = {"A", "B", "C"}; AtomicReferenceArray<String> atomicArray = new AtomicReferenceArray<>(array);
AtomicReferenceArray এর সাধারণ মেথড
get(int index)
- বর্ণনা: নির্দিষ্ট
indexএ থাকা ভ্যালু রিটার্ন করে। উদাহরণ:
System.out.println(atomicArray.get(0)); // আউটপুট: "A"
set(int index, E newValue)
- বর্ণনা: নির্দিষ্ট
indexএ একটি নতুন মান সেট করে। এটি atomic নয়। উদাহরণ:
atomicArray.set(1, "New B"); System.out.println(atomicArray.get(1)); // আউটপুট: "New B"
compareAndSet(int index, E expect, E update)
- বর্ণনা:
যদিindex-এ থাকা ভ্যালুexpectএর সমান হয়, তবে এটিupdateমানে আপডেট করে এবংtrueরিটার্ন করে। অন্যথায় কিছুই পরিবর্তন করে না এবংfalseরিটার্ন করে। উদাহরণ:
boolean result = atomicArray.compareAndSet(1, "New B", "Updated B"); System.out.println(result); // আউটপুট: true System.out.println(atomicArray.get(1)); // আউটপুট: "Updated B"
getAndSet(int index, E newValue)
- বর্ণনা:
indexএ থাকা বর্তমান মানটি রিটার্ন করে এবং নতুন মান সেট করে। উদাহরণ:
String oldValue = atomicArray.getAndSet(2, "New C"); System.out.println(oldValue); // আউটপুট: "C" System.out.println(atomicArray.get(2)); // আউটপুট: "New C"
lazySet(int index, E newValue)
- বর্ণনা:
এটিset()এর মতো কাজ করে তবে কিছু অপ্টিমাইজেশনের জন্য "lazy" উপায়ে মান আপডেট করে। সাধারণত এটি একসঙ্গে চলমান থ্রেডগুলোর জন্য কার্যকর। উদাহরণ:
atomicArray.lazySet(3, "Lazy D");
length()
- বর্ণনা: অ্যারের দৈর্ঘ্য রিটার্ন করে।
উদাহরণ:
System.out.println(atomicArray.length()); // আউটপুট: ৫
উদাহরণ: AtomicReferenceArray ব্যবহার
import java.util.concurrent.atomic.AtomicReferenceArray;
public class AtomicReferenceArrayExample {
public static void main(String[] args) {
// বিদ্যমান অ্যারে থেকে AtomicReferenceArray তৈরি
String[] array = {"A", "B", "C", "D", "E"};
AtomicReferenceArray<String> atomicArray = new AtomicReferenceArray<>(array);
// মান পড়া এবং সেট করা
System.out.println("Initial Value at index 1: " + atomicArray.get(1)); // আউটপুট: B
atomicArray.set(1, "Updated B");
System.out.println("Updated Value at index 1: " + atomicArray.get(1)); // আউটপুট: Updated B
// compareAndSet ব্যবহার
boolean isUpdated = atomicArray.compareAndSet(2, "C", "Updated C");
System.out.println("Compare and Set Result: " + isUpdated); // আউটপুট: true
System.out.println("Value at index 2: " + atomicArray.get(2)); // আউটপুট: Updated C
// getAndSet ব্যবহার
String oldValue = atomicArray.getAndSet(3, "Updated D");
System.out.println("Old Value at index 3: " + oldValue); // আউটপুট: D
System.out.println("New Value at index 3: " + atomicArray.get(3)); // আউটপুট: Updated D
}
}
AtomicReferenceArray এর সুবিধা
- Thread Safety: মাল্টি-থ্রেডিংয়ের জন্য উপযোগী।
- Atomicity: প্রতিটি মেথড ডেটা ম্যানিপুলেশনে atomic operation নিশ্চিত করে।
- Flexibility: এটি অবজেক্ট রেফারেন্স ব্যবহার করে, যা প্রায় সব ধরনের ডেটা মডেল পরিচালনা করতে পারে।
- Performance: লক-মুক্ত (lock-free) পদ্ধতি হওয়ায় পারফরম্যান্স উন্নত করে।
AtomicReferenceArray এর সীমাবদ্ধতা
- Fixed Size: অ্যারের আকার নির্দিষ্ট করার পরে পরিবর্তন করা যায় না।
- Complexity: সাধারণ array পরিচালনার তুলনায় কিছুটা জটিল।
- Overhead: থ্রেড-সেফ অপারেশন নিশ্চিত করার জন্য কিছু পারফরম্যান্স ওভারহেড তৈরি হতে পারে।
AtomicReferenceArray মাল্টি-থ্রেডেড পরিবেশে array of references পরিচালনার জন্য একটি কার্যকর সমাধান, যেখানে থ্রেড সেফটি এবং ডেটার সঠিকতা গুরুত্বপূর্ণ। এটি বিশেষ করে ডেটা ম্যানিপুলেশনের ক্ষেত্রে atomicity নিশ্চিত করে।
AtomicReferenceArray হল java.util.concurrent.atomic প্যাকেজের একটি ক্লাস, যা reference arrays এর উপরে atomic operations সম্পন্ন করতে ব্যবহৃত হয়। এটি Generics এর সাথে ব্যবহার করা যায় এবং থ্রেড-সেফ (thread-safe) পদ্ধতিতে reference types পরিচালনা করতে সাহায্য করে।
AtomicReferenceArray কী?
- এটি একটি atomic array of objects যেখানে প্রতিটি অপারেশন thread-safe।
- Generics ব্যবহার করে বিভিন্ন ধরনের ডেটা (যেমন String, Object, Custom Class) এর উপর কাজ করতে পারে।
- এটি লক-মুক্ত (lock-free) অপারেশন সরবরাহ করে, যার ফলে উচ্চ কার্যক্ষমতা বজায় থাকে।
- Thread Safety নিশ্চিত করে একাধিক থ্রেড একযোগে ডেটা ম্যানিপুলেট করলেও ডেটা সঠিক থাকে।
AtomicReferenceArray এর প্রধান বৈশিষ্ট্য
- Atomic Operations: প্রতিটি অপারেশন যেমন get(), set(), এবং compareAndSet() indivisible বা অখণ্ড।
- Thread-Safe: একাধিক থ্রেড একই সময়ে ডেটা অ্যাক্সেস বা পরিবর্তন করলেও ডেটা দুর্নীতি হয় না।
- Generics Support: এটি যেকোনো reference type (Generics) এর জন্য ব্যবহারযোগ্য।
- Non-blocking Performance: লক ছাড়াই ডেটা পরিচালিত হয়, যা কার্যক্ষমতা বাড়ায়।
- Immutability of Size: একটি AtomicReferenceArray এর সাইজ তৈরি হওয়ার পরে পরিবর্তন করা যায় না।
AtomicReferenceArray তৈরি করা
import java.util.concurrent.atomic.AtomicReferenceArray;
public class AtomicReferenceArrayExample {
public static void main(String[] args) {
// AtomicReferenceArray তৈরি
AtomicReferenceArray<String> atomicArray = new AtomicReferenceArray<>(5);
// ডেটা সেট করা
atomicArray.set(0, "Java");
atomicArray.set(1, "Python");
atomicArray.set(2, "C++");
// ডেটা পড়া
System.out.println("Index 0: " + atomicArray.get(0)); // Output: Java
System.out.println("Index 1: " + atomicArray.get(1)); // Output: Python
// compareAndSet ব্যবহার
boolean updated = atomicArray.compareAndSet(1, "Python", "JavaScript");
System.out.println("Updated: " + updated); // Output: true
System.out.println("Index 1: " + atomicArray.get(1)); // Output: JavaScript
}
}
AtomicReferenceArray এর মেথডসমূহ
১. get(int index)
নির্দিষ্ট index থেকে মান পড়ে।
String value = atomicArray.get(0); // Index 0 থেকে ডেটা পড়ে
২. set(int index, E newValue)
নির্দিষ্ট index এ একটি নতুন মান সেট করে।
atomicArray.set(1, "Python"); // Index 1 এ Python সেট
৩. compareAndSet(int index, E expected, E newValue)
যদি নির্দিষ্ট index এর বর্তমান মান expected এর সমান হয়, তবে এটি newValue দিয়ে আপডেট করে। এটি atomic check-and-set অপারেশন।
boolean isUpdated = atomicArray.compareAndSet(1, "Python", "JavaScript");
৪. getAndSet(int index, E newValue)
নির্দিষ্ট index এর বর্তমান মানটি রিটার্ন করে এবং একটি নতুন মান সেট করে।
String oldValue = atomicArray.getAndSet(2, "C#");
৫. length()
অ্যারের সাইজ রিটার্ন করে।
int size = atomicArray.length(); // আউটপুট: 5
AtomicReferenceArray ব্যবহার কেন গুরুত্বপূর্ণ?
১. Thread-Safe Arrays
একাধিক থ্রেড যখন একটি reference array এর উপরে কাজ করে, তখন AtomicReferenceArray ডেটা সঠিকতা নিশ্চিত করে।
২. Generics এর সমর্থন
Generics এর মাধ্যমে এটি বিভিন্ন ডেটা টাইপের সাথে ব্যবহার করা যায়, যেমন Strings, Custom Objects, ইত্যাদি।
৩. Race Condition প্রতিরোধ
প্রতিটি অপারেশন atomic হওয়ার কারণে race condition প্রতিরোধ করা যায়।
৪. Performance Optimization
লক-মুক্ত (lock-free) অপারেশন পারফরম্যান্স বাড়ায় এবং synchronization overhead হ্রাস করে।
উদাহরণ: Custom Class এর সাথে Generics ব্যবহার
import java.util.concurrent.atomic.AtomicReferenceArray;
class Product {
String name;
double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return name + " - $" + price;
}
}
public class CustomClassExample {
public static void main(String[] args) {
// Custom Class এর জন্য AtomicReferenceArray
AtomicReferenceArray<Product> productArray = new AtomicReferenceArray<>(3);
// প্রোডাক্ট যুক্ত করা
productArray.set(0, new Product("Laptop", 999.99));
productArray.set(1, new Product("Smartphone", 599.99));
// প্রোডাক্ট পড়া
System.out.println("Index 0: " + productArray.get(0)); // Output: Laptop - $999.99
System.out.println("Index 1: " + productArray.get(1)); // Output: Smartphone - $599.99
// compareAndSet ব্যবহার
boolean updated = productArray.compareAndSet(1,
new Product("Smartphone", 599.99),
new Product("Tablet", 399.99));
System.out.println("Updated: " + updated); // Output: false
}
}
AtomicReferenceArray এর সুবিধা
- Thread-Safe Reference Management: অ্যারেতে একাধিক থ্রেড কাজ করলেও ডেটা নিরাপদ থাকে।
- Generics Support: যেকোনো টাইপের ডেটার সাথে ব্যবহার করা যায়।
- Race Condition প্রতিরোধ: থ্রেডের মধ্যে ডেটা কনসিস্টেন্সি নিশ্চিত করে।
- High Performance: লক ছাড়াই ডেটা পরিচালিত হয়।
AtomicReferenceArray এর সীমাবদ্ধতা
- Immutable Size: অ্যারের সাইজ তৈরি হওয়ার পরে পরিবর্তন করা যায় না।
- Complexity: সহজ অ্যারের তুলনায় ব্যবহার কিছুটা জটিল।
- Generics Comparisons: compareAndSet() শুধুমাত্র reference equality চেক করে, deep equality নয়।
উপসংহার
AtomicReferenceArray মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে reference types পরিচালনার জন্য একটি কার্যকর সমাধান। এটি thread safety, atomicity, এবং high performance নিশ্চিত করে। Generics এর সমর্থনের মাধ্যমে এটি আরও কার্যকর হয়ে ওঠে, বিশেষত যেখানে ডেটা কনসিস্টেন্সি এবং রেস কন্ডিশন প্রতিরোধ গুরুত্বপূর্ণ।
AtomicReferenceArray Java এর একটি ক্লাস যা atomic operations সহ reference arrays পরিচালনা করার জন্য ব্যবহৃত হয়। এটি java.util.concurrent.atomic প্যাকেজের অংশ, যা মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে ব্যবহৃত হয় এবং থ্রেড-সেফ ডেটা অপারেশন সমর্থন করে।
এই ক্লাসে বিভিন্ন গুরুত্বপূর্ণ মেথড আছে, যেগুলি ডেটা এক্সেস ও আপডেট করার সময় থ্রেড-সেফনেস নিশ্চিত করে। এখানে get(), set(), এবং compareAndSet() মেথডগুলোর বিস্তারিত আলোচনা করা হলো।
১. get(int index) Method
get() মেথড একটি নির্দিষ্ট index থেকে অ্যারের মান পড়ে। এটি একটি থ্রেড-সেফ অপারেশন, অর্থাৎ একাধিক থ্রেড একই অ্যারের একাধিক উপাদান পড়লেও ডেটা সঠিকভাবে রিটার্ন হবে।
সিনট্যাক্স:
public E get(int index)
প্যারামিটার:
- index: অ্যারের index যার মান আপনি পড়তে চান।
রিটার্ন:
- রিটার্ন করে index তে থাকা মান (যে ধরনের অবজেক্ট অ্যারে ধারণ করে)।
উদাহরণ:
AtomicReferenceArray<String> atomicArray = new AtomicReferenceArray<>(5);
atomicArray.set(0, "Hello");
atomicArray.set(1, "World");
String value = atomicArray.get(0);
System.out.println(value); // আউটপুট: Hello
২. set(int index, E newValue) Method
set() মেথড একটি নির্দিষ্ট index তে নতুন মান সেট করে। এই অপারেশনটি atomic এবং থ্রেড-সেফ, অর্থাৎ একাধিক থ্রেড একই সময় একই index এ মান সেট করতে পারবে না।
সিনট্যাক্স:
public void set(int index, E newValue)
প্যারামিটার:
- index: অ্যারের index যেখানে মানটি সেট করতে চান।
- newValue: নতুন মান যা index তে সেট করা হবে।
উদাহরণ:
AtomicReferenceArray<String> atomicArray = new AtomicReferenceArray<>(5);
atomicArray.set(0, "Hello");
atomicArray.set(1, "World");
// নতুন মান সেট করা
atomicArray.set(0, "Hi");
System.out.println(atomicArray.get(0)); // আউটপুট: Hi
৩. compareAndSet(int index, E expect, E update) Method
compareAndSet() একটি atomic অপারেশন যা নির্দিষ্ট index তে expect মানের সাথে তুলনা করে এবং যদি তা মেলে তবে update মান সেট করে। এটি একটি compare-and-swap (CAS) অপারেশন। এটি মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে race condition প্রতিরোধে সহায়ক।
সিনট্যাক্স:
public boolean compareAndSet(int index, E expect, E update)
প্যারামিটার:
- index: অ্যারের index যেটিতে আপনি কাজ করতে চান।
- expect: যেই মানটি index তে উপস্থিত থাকতে হবে, যাতে update মান সেট করা যাবে।
- update: নতুন মান যা expect এর সাথে মিললে index এ সেট হবে।
রিটার্ন:
- true: যদি index তে expect মান মিলে যায় এবং তা সফলভাবে update হয়।
- false: যদি index তে expect মান না মেলে এবং কোন আপডেট না হয়।
উদাহরণ:
AtomicReferenceArray<String> atomicArray = new AtomicReferenceArray<>(5);
atomicArray.set(0, "Hello");
boolean isUpdated = atomicArray.compareAndSet(0, "Hello", "Hi");
System.out.println("Updated: " + isUpdated); // আউটপুট: Updated: true
System.out.println(atomicArray.get(0)); // আউটপুট: Hi
// যদি মান না মেলে
boolean isUpdatedFailed = atomicArray.compareAndSet(0, "World", "Java");
System.out.println("Updated: " + isUpdatedFailed); // আউটপুট: Updated: false
get(), set(), এবং compareAndSet() এর মধ্যে পার্থক্য
get()শুধুমাত্র অ্যারের নির্দিষ্ট index তে থাকা মান পড়ে এবং কোনো পরিবর্তন করে না।set()নির্দিষ্ট index তে একটি নতুন মান সেট করে এবং এটি সরাসরি ডেটাকে আপডেট করে।compareAndSet()প্রথমে একটি expect মানের সাথে তুলনা করে, যদি তা মেলে তবে update মান সেট করা হয়। এটি একটি তুলনা এবং পরিবর্তন (CAS) অপারেশন যা thread-safety নিশ্চিত করে এবং race condition প্রতিরোধে ব্যবহৃত হয়।
AtomicReferenceArray মেথডগুলি যেমন get(), set(), এবং compareAndSet() মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে thread-safe অ্যারের অপারেশন সঞ্চালনে অত্যন্ত কার্যকর।
get()মান পড়ে,set()মান আপডেট করে,compareAndSet()সুনির্দিষ্ট মানের সাথে তুলনা করে এবং শুধু তখনই সেট করে যখন পূর্বের মান মেলে।
এগুলি atomic operations প্রদান করে, যা অ্যারে-এ ডেটার সঠিকতা এবং সুরক্ষা নিশ্চিত করে, বিশেষত যখন একাধিক থ্রেড একই অ্যারে ব্যবহার করে।
Read more