FileChannel এর মাধ্যমে File Locking কিভাবে কাজ করে?

File Locking - জাভা নিও (Java Nio) - Java Technologies

277

Java NIO (Non-blocking I/O) এর মাধ্যমে FileChannel ব্যবহার করে ফাইল লকিং একটি গুরুত্বপূর্ণ প্রক্রিয়া, যা একই ফাইলের উপর একাধিক থ্রেড বা প্রোগ্রামকে একসাথে কাজ করার জন্য সীমাবদ্ধ করতে ব্যবহৃত হয়। যখন একটি ফাইল একটি থ্রেড বা প্রোগ্রাম দ্বারা লক করা হয়, তখন অন্য থ্রেড বা প্রোগ্রাম ঐ ফাইলটি ব্যবহার করতে পারবে না যতক্ষণ না লক মুক্ত না হয়। এটি ডেটার অপর্যাপ্ত অ্যাক্সেস বা প্রতিযোগিতামূলক শর্ত (race conditions) এড়াতে সাহায্য করে।

Java NIO তে ফাইল লকিং FileChannel ক্লাসের মাধ্যমে পরিচালিত হয়। lock() এবং tryLock() মেথড দুটি ফাইল লকিং করার জন্য ব্যবহৃত হয়। ফাইল লকিংটি Exclusive Lock বা Shared Lock হতে পারে, এবং এটি blocking বা non-blocking মোডে কাজ করতে পারে।


FileChannel এর মাধ্যমে File Locking কিভাবে কাজ করে?

১. File Locking Types:

  • Exclusive Lock (একক লক): এটি ফাইলের একমাত্র মালিকানা দেয়। যখন একটি থ্রেড বা প্রোগ্রাম ফাইলটি এক্সক্লুসিভ লক করে, তখন অন্য কোনও থ্রেড বা প্রোগ্রাম ফাইলটি পড়তে বা লিখতে পারবে না।
  • Shared Lock (শেয়ারড লক): এটি একাধিক থ্রেড বা প্রোগ্রামকে একই ফাইল পড়তে দেয়, তবে একে একে লেখার অনুমতি দেয় না। একাধিক থ্রেড একই সময়ে ফাইলটি পড়তে পারে তবে লেখার জন্য এক্সক্লুসিভ লক প্রয়োজন।

২. Blocking vs Non-blocking Locking:

  • Blocking Lock: যখন একটি থ্রেড ফাইল লক করতে চায় এবং ফাইলটি অন্য থ্রেড দ্বারা লক করা থাকে, তখন তা ব্লক হবে এবং থ্রেডটি অন্য থ্রেডের লক মুক্ত না হওয়া পর্যন্ত অপেক্ষা করবে।
  • Non-blocking Lock: ফাইলটি যদি লক করা থাকে, তবে এটি তৎক্ষণাৎ একটি ব্যতিক্রম (exception) সৃষ্টি করবে বা null ফেরত দেবে, এবং থ্রেডটি কোনো বিলম্ব ছাড়াই অন্য কাজ করতে সক্ষম হবে।

৩. File Locking উদাহরণ:

নিচে একটি উদাহরণ দেওয়া হলো, যেখানে FileChannel ব্যবহার করে ফাইল লক করা হচ্ছে।

উদাহরণ ১: Blocking Exclusive Lock

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.file.*;

public class FileLockExample {
    public static void main(String[] args) {
        Path path = Paths.get("example.txt");
        
        try (RandomAccessFile file = new RandomAccessFile(path.toFile(), "rw");
             FileChannel fileChannel = file.getChannel()) {

            // ফাইল এক্সক্লুসিভভাবে লক করা
            FileLock lock = fileChannel.lock();
            System.out.println("File is locked.");

            // কিছু সময়ের জন্য ফাইল লক রাখা
            Thread.sleep(5000);

            // লক মুক্ত করা
            lock.release();
            System.out.println("File lock released.");

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

এখানে, fileChannel.lock() মেথড দিয়ে ফাইলটি এক্সক্লুসিভভাবে লক করা হয়েছে। অন্য কোনও থ্রেড বা প্রোগ্রাম ফাইলটি তখন ব্যবহার করতে পারবে না যতক্ষণ না এটি মুক্ত হয়। ৫ সেকেন্ড পর লক মুক্ত করা হয়েছে।


উদাহরণ ২: Non-blocking TryLock

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.file.*;

public class NonBlockingFileLockExample {
    public static void main(String[] args) {
        Path path = Paths.get("example.txt");

        try (RandomAccessFile file = new RandomAccessFile(path.toFile(), "rw");
             FileChannel fileChannel = file.getChannel()) {

            // Non-blocking tryLock() ব্যবহার
            FileLock lock = fileChannel.tryLock();

            if (lock != null) {
                System.out.println("File is locked.");
                // কিছু সময়ের জন্য ফাইল লক রাখা
                Thread.sleep(5000);
                lock.release();
                System.out.println("File lock released.");
            } else {
                System.out.println("File is already locked by another process.");
            }

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

এখানে, fileChannel.tryLock() মেথডটি ব্যবহার করা হয়েছে, যা যদি ফাইলটি অন্য কোনও থ্রেড দ্বারা লক করা থাকে, তাহলে এটি তৎক্ষণাৎ null ফেরত দেয় এবং থ্রেডটি ব্লক হতে দেয় না। যদি ফাইলটি লক করা না থাকে, তবে এটি ফাইলটি লক করে।


৪. File Locking এর সুবিধা ও ব্যবহার:

১. Data Integrity (ডেটা অখণ্ডতা):

ফাইল লকিং ব্যবহার করলে একাধিক থ্রেড বা প্রোগ্রাম একসাথে একই ফাইলের উপর কাজ করতে পারে না, যা ডেটার অখণ্ডতা রক্ষা করতে সাহায্য করে। উদাহরণস্বরূপ, দুটি থ্রেড যদি একসাথে একটি ফাইলে লেখা শুরু করে, তবে ডেটা দুর্নীতি (data corruption) ঘটতে পারে। ফাইল লকিং এর মাধ্যমে এটি রোধ করা হয়।

২. Concurrency Control (সামগ্রিক নিয়ন্ত্রণ):

একই সময়ে একাধিক থ্রেডের ফাইল এক্সেসের ওপর নিয়ন্ত্রণ প্রতিষ্ঠিত হয়, যার ফলে একই সময়ে একাধিক থ্রেড একই ফাইলের ওপর ডেটা লেখার চেষ্টা করবে না।

৩. Avoiding Race Conditions (প্রতিযোগিতামূলক শর্তের এড়ানো):

ফাইল লকিং প্রতিযোগিতামূলক শর্ত (race conditions) এড়াতে সহায়ক, যেখানে একাধিক থ্রেড একে অপরের সাথে প্রতিযোগিতা করে।


Java NIO তে FileChannel ব্যবহার করে ফাইল লকিং একটি গুরুত্বপূর্ণ ফিচার যা ডেটা এক্সেসের সময় প্রতিযোগিতা (race conditions) এবং ডেটা দুর্নীতির সমস্যা রোধ করতে সাহায্য করে। আপনি exclusive lock এবং shared lock এর মাধ্যমে ফাইলের একমাত্র মালিকানা বা একাধিক থ্রেডকে একই সময়ে পড়ার অনুমতি দিতে পারেন। lock() এবং tryLock() মেথডগুলি ফাইল লকিং পরিচালনা করতে সাহায্য করে, এবং এগুলি ব্লকিং বা নন-ব্লকিং মোডে কাজ করতে পারে। Java NIO তে ফাইল লকিং ব্যবহার করে আপনি একই ফাইলের প্রতি একাধিক থ্রেড বা প্রোগ্রামের অ্যাক্সেসের সমন্বয় করতে পারেন, যা কার্যকরভাবে ডেটা নিরাপত্তা নিশ্চিত করে।


Content added By
Promotion

Are you sure to start over?

Loading...