Visibility এবং Ordering Problems এর সমাধান

Java Memory Model (JMM) - জাভা কনকারেন্সি (Java Concurrency) - Java Technologies

294

মাল্টিথ্রেডেড প্রোগ্রামিংয়ে Visibility এবং Ordering Problems সাধারণ সমস্যা। এগুলোর সমাধান নিশ্চিত করার জন্য জাভা বিভিন্ন প্রযুক্তি ও টুল সরবরাহ করে।


Visibility Problem

Visibility Problem হয় যখন একটি থ্রেডে আপডেট হওয়া ডেটা অন্য থ্রেডের কাছে দৃশ্যমান হয় না। এর মূল কারণ হলো থ্রেডের নিজস্ব CPU Cache যেখানে ডেটা স্থানীয়ভাবে সংরক্ষিত হয়।

সমাধান:

  1. volatile কীওয়ার্ড ব্যবহার করা:
    • এটি নিশ্চিত করে যে একটি ভেরিয়েবল সবথ্রেডের জন্য মেইন মেমরি থেকে পড়া এবং লেখা হয়।

উদাহরণ:

class VisibilityExample {
    private volatile boolean running = true;

    public void stop() {
        running = false; // মেইন মেমরিতে আপডেট
    }

    public void run() {
        while (running) {
            // কাজ চলমান
        }
        System.out.println("Thread stopped.");
    }

    public static void main(String[] args) throws InterruptedException {
        VisibilityExample example = new VisibilityExample();
        
        Thread thread = new Thread(example::run);
        thread.start();

        Thread.sleep(1000); // থ্রেড ১ সেকেন্ড চালান
        example.stop(); // থ্রেড বন্ধের জন্য সিগন্যাল দিন
        thread.join();
    }
}
  1. সিঙ্ক্রোনাইজেশন ব্যবহার করা:
    • সিঙ্ক্রোনাইজড ব্লক বা মেথড ব্যবহার করলে থ্রেড মেইন মেমরির সাথে ডেটা সিঙ্ক্রোনাইজ করে।

Ordering Problem

Ordering Problem হয় যখন কোডের এক্সিকিউশন সিকোয়েন্স (অর্ডার) প্রোগ্রামের লজিকের সঙ্গে মেলে না। এই সমস্যা Instruction Reordering এর কারণে ঘটে, যা জাভার কম্পাইলার বা প্রসেসর করে থাকে।

সমাধান:

  1. volatile কীওয়ার্ড ব্যবহার করা:
    • এটি শুধু Visibility নিশ্চিত করে না, বরং Instruction Reordering প্রতিরোধ করে।

উদাহরণ:

class OrderingExample {
    private volatile int value = 0;
    private volatile boolean flag = false;

    public void writer() {
        value = 42; // Step 1
        flag = true; // Step 2 (এই অর্ডার মেনটেইন করা হবে)
    }

    public void reader() {
        if (flag) { // Step 3
            System.out.println("Value: " + value); // Step 4 (value অবশ্যই 42 হবে)
        }
    }

    public static void main(String[] args) {
        OrderingExample example = new OrderingExample();

        Thread writerThread = new Thread(example::writer);
        Thread readerThread = new Thread(example::reader);

        writerThread.start();
        readerThread.start();
    }
}
  1. synchronized ব্লক ব্যবহার করা:
    • এটি মেমরি ব্যারিয়ার তৈরি করে যা থ্রেডের মধ্যে Visibility এবং Ordering নিশ্চিত করে।

উদাহরণ:

class SynchronizedOrdering {
    private int value = 0;

    public synchronized void writer() {
        value = 42; // মেইন মেমরিতে আপডেট
    }

    public synchronized int reader() {
        return value; // মেইন মেমরি থেকে পড়া
    }

    public static void main(String[] args) {
        SynchronizedOrdering example = new SynchronizedOrdering();

        Thread writerThread = new Thread(example::writer);
        Thread readerThread = new Thread(() -> {
            System.out.println("Read Value: " + example.reader());
        });

        writerThread.start();
        readerThread.start();
    }
}
  1. java.util.concurrent প্যাকেজ ব্যবহার করা:
    • এই প্যাকেজের ক্লাস যেমন AtomicInteger, ReentrantLock ইত্যাদি ব্যবহার করলে Visibility এবং Ordering সমস্যা সমাধান হয়।

উদাহরণ:

import java.util.concurrent.atomic.AtomicInteger;

class AtomicExample {
    private AtomicInteger counter = new AtomicInteger(0);

    public void increment() {
        counter.incrementAndGet(); // Atomically increment
    }

    public int getValue() {
        return counter.get(); // Atomically get value
    }

    public static void main(String[] args) {
        AtomicExample example = new AtomicExample();

        Thread incrementThread = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                example.increment();
            }
        });

        incrementThread.start();

        try {
            incrementThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Final Counter Value: " + example.getValue());
    }
}

Visibility এবং Ordering Problems এর প্রতিরোধের কৌশল

কৌশল/প্রযুক্তিVisibility নিশ্চিত করেOrdering নিশ্চিত করে
volatile
synchronized
Atomic Classes

  1. Visibility Problem: প্রতিরোধে volatile, synchronized, অথবা Atomic ক্লাস ব্যবহার করুন।
  2. Ordering Problem: প্রতিরোধে volatile, synchronized, অথবা java.util.concurrent টুল ব্যবহার করুন।
  3. মাল্টিথ্রেডেড প্রোগ্রামিংয়ে এই সমস্যাগুলো বুঝে সঠিক সমাধান প্রয়োগ করলে কনকারেন্সি আরো নিরাপদ এবং কার্যকর হবে।
Content added By
Promotion

Are you sure to start over?

Loading...