java.util.concurrent.atomic প্যাকেজের পরিচিতি

Atomic Operations এবং Variables - জাভা কনকারেন্সি (Java Concurrency) - Java Technologies

327

জাভার java.util.concurrent.atomic প্যাকেজটি একটি গুরুত্বপূর্ণ কনকারেন্সি টুল যা মাল্টি-থ্রেডেড অ্যাপ্লিকেশনে পরমাণু (atomic) কার্য সম্পাদনের জন্য ব্যবহৃত হয়। এটি Atomic Variable Classes সরবরাহ করে, যা ডেটা ম্যানিপুলেশন অপারেশনগুলিকে atomic (অবিভাজ্য) করে তোলে। এই প্যাকেজটি synchronized ব্লকের বিকল্প হিসেবে ব্যবহৃত হয়, যা পারফরম্যান্স উন্নত করে।


Atomic (পরমাণু) কি?

পরমাণু অপারেশন বলতে এমন একটি অপারেশনকে বোঝায় যা থ্রেড-সেইফ এবং বিভাজিত হয় না। অর্থাৎ, একাধিক থ্রেড একই সময়ে ডেটা পরিবর্তন করতে পারলেও কোনো ডেটা দুর্নীতি ঘটে না।


java.util.concurrent.atomic প্যাকেজের ক্লাসসমূহ

১. AtomicInteger

  • একটি int ভেরিয়েবলকে পরমাণু অপারেশন দিয়ে পরিচালনা করার জন্য।
  • থ্রেড-সেইফ increment, decrement, এবং compareAndSet মেথড প্রদান করে।

২. AtomicLong

  • একটি long ভেরিয়েবল পরিচালনা করে একইভাবে যেমন AtomicInteger

৩. AtomicBoolean

  • একটি boolean ভেরিয়েবলকে পরিচালনা করে।

৪. AtomicReference

  • একটি অবজেক্টকে পরমাণু অপারেশন দিয়ে পরিচালনা করতে ব্যবহৃত হয়।

৫. AtomicStampedReference

  • একটি অবজেক্টের সাথে একটি স্ট্যাম্প মান ব্যবহার করে পরিবর্তন নিশ্চিত করে।

৬. AtomicMarkableReference

  • অবজেক্ট পরিবর্তনের জন্য একটি মার্ক বা চিহ্ন ব্যবহার করে।

AtomicInteger উদাহরণ

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {
    public static void main(String[] args) {
        AtomicInteger atomicInt = new AtomicInteger(0);

        // মান বৃদ্ধি (Increment)
        System.out.println("Initial Value: " + atomicInt.get());
        atomicInt.incrementAndGet(); // ১ যোগ করে মান ফেরত দেয়
        System.out.println("After Increment: " + atomicInt.get());

        // মান হ্রাস (Decrement)
        atomicInt.decrementAndGet(); // ১ কমায় এবং মান ফেরত দেয়
        System.out.println("After Decrement: " + atomicInt.get());

        // নির্দিষ্ট মান সেট করা (Set a value)
        atomicInt.set(5);
        System.out.println("Set Value: " + atomicInt.get());

        // Compare And Set
        boolean isUpdated = atomicInt.compareAndSet(5, 10); // যদি বর্তমান মান ৫ হয়, তাহলে ১০ সেট করে
        System.out.println("Compare and Set Successful: " + isUpdated);
        System.out.println("Updated Value: " + atomicInt.get());
    }
}

আউটপুট:

Initial Value: 0
After Increment: 1
After Decrement: 0
Set Value: 5
Compare and Set Successful: true
Updated Value: 10

AtomicReference উদাহরণ

import java.util.concurrent.atomic.AtomicReference;

public class AtomicReferenceExample {
    public static void main(String[] args) {
        AtomicReference<String> atomicString = new AtomicReference<>("Initial Value");

        System.out.println("Original Value: " + atomicString.get());

        // মান আপডেট করা
        atomicString.set("Updated Value");
        System.out.println("After Set: " + atomicString.get());

        // Compare And Set
        boolean isUpdated = atomicString.compareAndSet("Updated Value", "Final Value");
        System.out.println("Compare and Set Successful: " + isUpdated);
        System.out.println("Updated Value: " + atomicString.get());
    }
}

আউটপুট:

Original Value: Initial Value
After Set: Updated Value
Compare and Set Successful: true
Updated Value: Final Value

AtomicStampedReference উদাহরণ

import java.util.concurrent.atomic.AtomicStampedReference;

public class AtomicStampedReferenceExample {
    public static void main(String[] args) {
        AtomicStampedReference<Integer> stampedRef = new AtomicStampedReference<>(100, 1);

        System.out.println("Initial Value: " + stampedRef.getReference());
        System.out.println("Initial Stamp: " + stampedRef.getStamp());

        // আপডেট করুন
        boolean isUpdated = stampedRef.compareAndSet(100, 200, 1, 2);
        System.out.println("Update Successful: " + isUpdated);
        System.out.println("Updated Value: " + stampedRef.getReference());
        System.out.println("Updated Stamp: " + stampedRef.getStamp());
    }
}

আউটপুট:

Initial Value: 100
Initial Stamp: 1
Update Successful: true
Updated Value: 200
Updated Stamp: 2

AtomicBoolean উদাহরণ

import java.util.concurrent.atomic.AtomicBoolean;

public class AtomicBooleanExample {
    public static void main(String[] args) {
        AtomicBoolean atomicBoolean = new AtomicBoolean(false);

        System.out.println("Initial Value: " + atomicBoolean.get());

        // মান পরিবর্তন করুন
        atomicBoolean.set(true);
        System.out.println("Updated Value: " + atomicBoolean.get());

        // Compare And Set
        boolean isUpdated = atomicBoolean.compareAndSet(true, false);
        System.out.println("Compare and Set Successful: " + isUpdated);
        System.out.println("Final Value: " + atomicBoolean.get());
    }
}

আউটপুট:

Initial Value: false
Updated Value: true
Compare and Set Successful: true
Final Value: false

কেন java.util.concurrent.atomic প্যাকেজ ব্যবহার করবেন?

  1. থ্রেড-সেইফ:
    • একাধিক থ্রেড থেকে ডেটা অ্যাক্সেস করলেও ডেটা কনসিস্টেন্সি বজায় থাকে।
  2. লক-ফ্রি (Lock-Free):
    • synchronized বা লকের প্রয়োজন নেই, যা পারফরম্যান্স উন্নত করে।
  3. অ্যাপ্লিকেশন পারফরম্যান্স:
    • CPU তে কম ওভারহেড সৃষ্টি করে।
  4. কমপ্লেক্সিটি হ্রাস:
    • সিম্পল মেথড (increment, compareAndSet) দিয়ে কাজ সম্পন্ন করা সহজ।

ব্যবহারের ক্ষেত্রে সীমাবদ্ধতা

  • এই প্যাকেজটি কেবলমাত্র primitive types এবং নির্দিষ্ট কিছু object references এর জন্য উপযোগী।
  • জটিল ডেটা স্ট্রাকচারের জন্য অন্য কনকারেন্সি টুল (যেমন ReentrantLock বা Concurrent Collections) প্রয়োজন।


java.util.concurrent.atomic প্যাকেজটি মাল্টি-থ্রেডেড প্রোগ্রামে ডেটা ম্যানিপুলেশনকে দ্রুত, নিরাপদ, এবং সহজ করে। এটি মাল্টি-থ্রেডেড অ্যাপ্লিকেশনগুলোর জন্য কার্যকর একটি সমাধান।

Content added By
Promotion

Are you sure to start over?

Loading...