3.1 সক্রিয় বস্তু

একটি অ্যাক্টিভ অবজেক্ট হল একটি ডিজাইন প্যাটার্ন যা একটি পদ্ধতির এক্সিকিউশন থ্রেডকে থ্রেড থেকে আলাদা করে যেখানে এটি বলা হয়েছিল। এই প্যাটার্নের উদ্দেশ্য হল অ্যাসিঙ্ক্রোনাস মেথড কল এবং একটি রিকোয়েস্ট প্রসেসিং সিডিউলার ব্যবহার করে সমান্তরাল এক্সিকিউশন প্রদান করা।

সরলীকৃত সংস্করণ:

সক্রিয় বস্তু

ক্লাসিক বৈকল্পিক:

সক্রিয় বস্তু 2

এই টেমপ্লেটটিতে ছয়টি উপাদান রয়েছে:

  • একটি প্রক্সি অবজেক্ট যা ক্লায়েন্টের পাবলিক পদ্ধতিতে একটি ইন্টারফেস প্রদান করে।
  • একটি ইন্টারফেস যা সক্রিয় বস্তুর জন্য অ্যাক্সেস পদ্ধতি সংজ্ঞায়িত করে।
  • ক্লায়েন্টদের কাছ থেকে আগত অনুরোধের তালিকা।
  • একটি সময়সূচী যে ক্রম নির্ধারণ করে যে প্রশ্নগুলি কার্যকর করা হবে৷
  • সক্রিয় বস্তু পদ্ধতি বাস্তবায়ন।
  • একটি কলব্যাক পদ্ধতি বা ক্লায়েন্ট একটি ফলাফল প্রাপ্ত করার জন্য একটি পরিবর্তনশীল.

3.2 লক

লক প্যাটার্ন হল একটি সিঙ্ক্রোনাইজেশন মেকানিজম যা একাধিক থ্রেডের মধ্যে শেয়ার করা রিসোর্সে একচেটিয়া অ্যাক্সেসের অনুমতি দেয়। লকগুলি হল একযোগে নিয়ন্ত্রণ নীতি কার্যকর করার এক উপায়৷

মূলত, একটি নরম লক ব্যবহার করা হয়, অনুমান করে যে প্রতিটি থ্রেড সংশ্লিষ্ট ভাগ করা সম্পদ অ্যাক্সেস করার আগে "লকটি অর্জন" করার চেষ্টা করে।

যাইহোক, কিছু সিস্টেম একটি বাধ্যতামূলক লকিং মেকানিজম প্রদান করে যার মাধ্যমে লক করা রিসোর্সে অননুমোদিত অ্যাক্সেসের প্রচেষ্টাকে থ্রেডে একটি ব্যতিক্রম ছুঁড়ে দিয়ে বাতিল করা হবে যা অ্যাক্সেস পাওয়ার চেষ্টা করেছে।

একটি সেমাফোর হল সবচেয়ে সহজ ধরনের তালা। ডেটা অ্যাক্সেসের ক্ষেত্রে, অ্যাক্সেসের মোডগুলির মধ্যে কোনও পার্থক্য করা হয় না: ভাগ করা (শুধু-পঠন) বা একচেটিয়া (পড়া-লেখা)। শেয়ার্ড মোডে, একাধিক থ্রেড শুধুমাত্র-পঠন মোডে ডেটা অ্যাক্সেস করার জন্য একটি লকের অনুরোধ করতে পারে। একচেটিয়া অ্যাক্সেস মোড আপডেট এবং মুছে ফেলার অ্যালগরিদমেও ব্যবহৃত হয়।

লক প্যাটার্ন

থ্রেড কার্যকর করার ধারাবাহিকতা অবরুদ্ধ করার কৌশল দ্বারা তালার প্রকারগুলি আলাদা করা হয়। বেশিরভাগ বাস্তবায়নে, একটি লকের অনুরোধ থ্রেডটিকে লক করা সংস্থানটি উপলব্ধ না হওয়া পর্যন্ত চালিয়ে যেতে বাধা দেয়।

একটি স্পিনলক হল একটি লক যা অ্যাক্সেস মঞ্জুর না হওয়া পর্যন্ত লুপে অপেক্ষা করে। এই ধরনের একটি লক খুব কার্যকর যদি একটি থ্রেড একটি অল্প সময়ের জন্য একটি লকের জন্য অপেক্ষা করে, এইভাবে থ্রেডের অত্যধিক পুনঃনির্ধারণ এড়ানো। থ্রেডগুলির একটি দীর্ঘ সময়ের জন্য লক ধরে রাখলে অ্যাক্সেসের জন্য অপেক্ষা করার খরচ উল্লেখযোগ্য হবে।

লক প্যাটার্ন 2

লকিং মেকানিজম কার্যকরভাবে বাস্তবায়ন করতে, হার্ডওয়্যার স্তরে সমর্থন প্রয়োজন। হার্ডওয়্যার সমর্থন এক বা একাধিক পারমাণবিক অপারেশন যেমন "পরীক্ষা-এন্ড-সেট", "ফেচ-এন্ড-অ্যাড" বা "তুলনা-এবং-অদলবদল" হিসাবে প্রয়োগ করা যেতে পারে। এই ধরনের নির্দেশাবলী আপনাকে বাধা ছাড়াই চেক করার অনুমতি দেয় যে লকটি বিনামূল্যে, এবং যদি তাই হয়, তাহলে লকটি অর্জন করুন।

3.3 মনিটর

মনিটর প্যাটার্ন একটি উচ্চ-স্তরের প্রক্রিয়া মিথস্ক্রিয়া এবং সিঙ্ক্রোনাইজেশন প্রক্রিয়া যা ভাগ করা সংস্থানগুলিতে অ্যাক্সেস সরবরাহ করে। একটি সাধারণ সংস্থান, সাধারণত হার্ডওয়্যার বা ভেরিয়েবলের একটি সেট ব্যবহার করে দুই বা ততোধিক কম্পিউটারের কাজগুলিকে সিঙ্ক্রোনাইজ করার একটি পদ্ধতি।

মনিটর-ভিত্তিক মাল্টিটাস্কিং-এ, কম্পাইলার বা দোভাষী স্বচ্ছভাবে যথাযথভাবে ফরম্যাট করা রুটিনে লক-আনলক কোড সন্নিবেশ করান, প্রোগ্রামারের কাছে স্বচ্ছভাবে, প্রোগ্রামারকে সুস্পষ্টভাবে সিঙ্ক্রোনাইজেশন আদিম কল করা থেকে বাঁচায়।

মনিটর গঠিত:

  • পদ্ধতির একটি সেট যা একটি ভাগ করা সম্পদের সাথে ইন্টারঅ্যাক্ট করে
  • মিউটেক্স
  • এই সম্পদের সাথে যুক্ত ভেরিয়েবল
  • একটি অপরিবর্তনীয় যা একটি জাতি শর্ত এড়াতে শর্ত সংজ্ঞায়িত করে

মনিটর পদ্ধতি কাজ শুরু করার আগে মিউটেক্স অর্জন করে এবং প্রক্রিয়াটি প্রস্থান না হওয়া পর্যন্ত বা একটি নির্দিষ্ট অবস্থার জন্য অপেক্ষা না করা পর্যন্ত এটি ধরে রাখে। যদি প্রতিটি পদ্ধতি গ্যারান্টি দেয় যে মিউটেক্স রিলিজ করার আগে ইনভেরিয়েন্টটি সত্য, তাহলে কোনো টাস্ক রেস অবস্থায় সম্পদ অর্জন করতে পারবে না।

এইভাবে সিঙ্ক্রোনাইজডwait() অপারেটর জাভাতে এবং পদ্ধতিগুলির সাথে কাজ করে notify()

3.4 ডাবল চেক লকিং

ডাবল চেক করা লকিং হল একটি সমান্তরাল ডিজাইন প্যাটার্ন যা লক পাওয়ার ওভারহেড কমানোর উদ্দেশ্যে।

প্রথমত, ব্লকিং অবস্থা কোন সিঙ্ক্রোনাইজেশন ছাড়াই চেক করা হয়। একটি থ্রেড শুধুমাত্র একটি লক অর্জন করার চেষ্টা করে যদি চেকের ফলাফল নির্দেশ করে যে এটি লকটি অর্জন করতে হবে।

//Double-Checked Locking
public final class Singleton {
private static Singleton instance; //Don't forget volatile modifier

public static Singleton getInstance() {
     if (instance == null) {                //Read

         synchronized (Singleton.class) {    //
             if (instance == null) {         //Read Write
                 instance = new Singleton(); //
             }
         }
     }
 }

কিভাবে একটি থ্রেড-নিরাপদ পরিবেশে একটি সিঙ্গলটন অবজেক্ট তৈরি করবেন?

public static Singleton getInstance() {
   if (instance == null)
    instance = new Singleton();
}

আপনি যদি বিভিন্ন থ্রেড থেকে একটি সিঙ্গেলটন অবজেক্ট তৈরি করেন, তাহলে এমন একটি পরিস্থিতি হতে পারে যেখানে একই সময়ে বেশ কয়েকটি বস্তু তৈরি হয় এবং এটি অগ্রহণযোগ্য। অতএব, একটি সিঙ্ক্রোনাইজড বিবৃতিতে বস্তুর সৃষ্টিকে মোড়ানো যুক্তিসঙ্গত।

public static Singleton getInstance() {
    synchronized (Singleton.class) {
        if (instance == null)
        instance = new Singleton();
    }
}

এই পদ্ধতি কাজ করবে, কিন্তু এটি একটি ছোট খারাপ দিক আছে. বস্তুটি তৈরি হওয়ার পরে, আপনি যতবার ভবিষ্যতে এটি পাওয়ার চেষ্টা করবেন, সিঙ্ক্রোনাইজড ব্লকে একটি চেক করা হবে, যার অর্থ বর্তমান থ্রেড এবং এটির সাথে সংযুক্ত সবকিছু লক করা হবে। সুতরাং এই কোডটি কিছুটা অপ্টিমাইজ করা যেতে পারে:

public static Singleton getInstance() {
     if (instance != null)
        return instance;

    synchronized (Singleton.class) {
        if (instance == null)
        instance = new Singleton();
    }
}

কিছু ভাষা এবং/অথবা কিছু মেশিনে এই প্যাটার্নটি নিরাপদে বাস্তবায়ন করা সম্ভব নয়। অতএব, এটি কখনও কখনও একটি বিরোধী প্যাটার্ন বলা হয়। এই ধরনের বৈশিষ্ট্যগুলি জাভা মেমরি মডেল এবং C++ মেমরি মডেলে "আগে ঘটে" কঠোর ক্রম সম্পর্কের আবির্ভাবের দিকে পরিচালিত করেছে।

এটি সাধারণত সিঙ্গেলটন ডিজাইন প্যাটার্নের মতো মাল্টি-থ্রেডেড প্রোগ্রামে অলস প্রারম্ভিকতা বাস্তবায়নের ওভারহেড কমাতে ব্যবহৃত হয়। একটি ভেরিয়েবলের অলস ইনিশিয়ালাইজেশনে, কম্পিউটেশনে ভেরিয়েবলের মান প্রয়োজন না হওয়া পর্যন্ত ইনিশিয়ালাইজেশন পিছিয়ে যায়।

3.5 সময়সূচী

সময়সূচী হল একটি সমান্তরাল নকশার প্যাটার্ন যা একটি সময়সূচী নীতি বাস্তবায়নের জন্য একটি প্রক্রিয়া প্রদান করে, কিন্তু কোনো নির্দিষ্ট নীতি থেকে স্বাধীন। থ্রেডগুলি যে ক্রমানুসারে ক্রমিক কোড কার্যকর করবে তা নিয়ন্ত্রণ করে, এমন একটি বস্তু ব্যবহার করে যা স্পষ্টভাবে অপেক্ষার থ্রেডের ক্রম নির্দিষ্ট করে।

আপনি অফিসিয়াল ডকুমেন্টেশনে এই টেমপ্লেট সম্পর্কে আরো বিস্তারিত জানতে পারেন। এছাড়াও রাশিয়ান ভাষায় একটি চমৎকার নিবন্ধ আছে ।