CodeGym /Java Blog /এলোমেলো /থ্রেড সিঙ্ক্রোনাইজেশন। সিঙ্ক্রোনাইজড অপারেটর
John Squirrels
লেভেল 41
San Francisco

থ্রেড সিঙ্ক্রোনাইজেশন। সিঙ্ক্রোনাইজড অপারেটর

এলোমেলো দলে প্রকাশিত
ওহে! আজ আমরা মাল্টিথ্রেডেড প্রোগ্রামিংয়ের বৈশিষ্ট্যগুলি বিবেচনা করা এবং থ্রেড সিঙ্ক্রোনাইজেশন সম্পর্কে কথা বলব। থ্রেড সিঙ্ক্রোনাইজেশন।  সিঙ্ক্রোনাইজড অপারেটর - 1

জাভাতে সিঙ্ক্রোনাইজেশন কি?

প্রোগ্রামিং ডোমেনের বাইরে, এটি এমন একটি ব্যবস্থাকে বোঝায় যা দুটি ডিভাইস বা প্রোগ্রামকে একসাথে কাজ করতে দেয়। উদাহরণস্বরূপ, একটি স্মার্টফোন এবং কম্পিউটার একটি Google অ্যাকাউন্টের সাথে সিঙ্ক্রোনাইজ করা যেতে পারে, এবং একটি ওয়েবসাইট অ্যাকাউন্ট সামাজিক নেটওয়ার্ক অ্যাকাউন্টের সাথে সিঙ্ক করা যেতে পারে যাতে আপনি সেগুলিকে সাইন ইন করতে ব্যবহার করতে পারেন৷ থ্রেড সিঙ্ক্রোনাইজেশনের একই অর্থ রয়েছে: এটি এমন একটি ব্যবস্থা যেখানে থ্রেডগুলি ইন্টারঅ্যাক্ট করে৷ একে অপরকে. পূর্ববর্তী পাঠে, আমাদের থ্রেডগুলি একে অপরের থেকে আলাদাভাবে বাস করত এবং কাজ করত। একজন একটি গণনা সঞ্চালিত করেছে, দ্বিতীয়জন ঘুমিয়েছে এবং তৃতীয়জন কনসোলে কিছু প্রদর্শন করেছে, কিন্তু তারা ইন্টারঅ্যাক্ট করেনি। বাস্তব প্রোগ্রামে, এই ধরনের পরিস্থিতি বিরল। একাধিক থ্রেড সক্রিয়ভাবে একই ডেটা সেটের সাথে কাজ করতে এবং সংশোধন করতে পারে। এতে সমস্যার সৃষ্টি হয়। একই জায়গায় একাধিক থ্রেড টেক্সট লেখার কল্পনা করুন, উদাহরণস্বরূপ, একটি টেক্সট ফাইল বা কনসোলে। এই ক্ষেত্রে, ফাইল বা কনসোল একটি ভাগ করা সম্পদ হয়ে ওঠে। থ্রেডগুলি একে অপরের অস্তিত্ব সম্পর্কে অবগত নয়, তাই তারা কেবল থ্রেড শিডিউলারের দ্বারা তাদের জন্য বরাদ্দকৃত সময়ে তারা যা করতে পারে তা লিখে। একটি সাম্প্রতিক পাঠে, আমরা এটি কোথায় নিয়ে যায় তার একটি উদাহরণ দেখেছি। এখন এটি স্মরণ করা যাক: থ্রেড সিঙ্ক্রোনাইজেশন।  সিঙ্ক্রোনাইজড অপারেটর - 2কারণটি এই সত্যের মধ্যে রয়েছে যে থ্রেডগুলি একে অপরের সাথে তাদের ক্রিয়াগুলির সমন্বয় না করে একটি ভাগ করা সংস্থান (কনসোল) এর সাথে কাজ করছে। যদি থ্রেড শিডিউলার থ্রেড-1-এ সময় বরাদ্দ করে, তাহলে এটি অবিলম্বে কনসোলে সবকিছু লিখে দেয়। অন্যান্য থ্রেড কি আছে বা ইতিমধ্যে লিখতে পরিচালিত না কোন ব্যাপার না. ফলাফল, আপনি দেখতে পাচ্ছেন, হতাশাজনক। এই কারণেই তারা একটি বিশেষ ধারণা, মিউটেক্স (পারস্পরিক বর্জন) প্রবর্তন করেছে , মাল্টিথ্রেডেড প্রোগ্রামিংয়ে। একটি mutex উদ্দেশ্যএকটি মেকানিজম প্রদান করা যাতে শুধুমাত্র একটি থ্রেড একটি নির্দিষ্ট সময়ে একটি বস্তুর অ্যাক্সেস করতে পারে। যদি থ্রেড-1 অবজেক্ট A এর মিউটেক্স অর্জন করে, তবে অন্যান্য থ্রেডগুলি বস্তুটি অ্যাক্সেস করতে এবং পরিবর্তন করতে সক্ষম হবে না। অবজেক্ট A এর mutex প্রকাশ না হওয়া পর্যন্ত অন্যান্য থ্রেডগুলিকে অপেক্ষা করতে হবে। এখানে জীবন থেকে একটি উদাহরণ: কল্পনা করুন যে আপনি এবং 10 জন অপরিচিত ব্যক্তি একটি অনুশীলনে অংশগ্রহণ করছেন। পালাক্রমে, আপনাকে আপনার ধারণাগুলি প্রকাশ করতে হবে এবং কিছু আলোচনা করতে হবে। কিন্তু যেহেতু আপনি একে অপরকে প্রথমবারের মতো দেখছেন, ক্রমাগত একে অপরকে বাধাগ্রস্ত না করতে এবং রাগে উড়তে না পারার জন্য, আপনি একটি 'টকিং বল' ব্যবহার করেন: শুধুমাত্র সেই বলটিই কথা বলতে পারে। এইভাবে আপনি একটি ভাল এবং ফলপ্রসূ আলোচনা শেষ করবেন। মূলত, বলটি একটি মিউটেক্স। যদি একটি বস্তুর মিউটেক্স একটি থ্রেডের হাতে থাকে, তবে অন্যান্য থ্রেডগুলি বস্তুর সাথে কাজ করতে পারে না।Objectক্লাস, যার মানে জাভাতে প্রতিটি বস্তুর একটি আছে।

সিঙ্ক্রোনাইজড অপারেটর কিভাবে কাজ করে

আসুন একটি নতুন কীওয়ার্ড জেনে নেই: সিঙ্ক্রোনাইজড । এটি কোডের একটি নির্দিষ্ট ব্লক চিহ্নিত করতে ব্যবহৃত হয়। যদি একটি কোড ব্লক synchronizedকীওয়ার্ড দিয়ে চিহ্নিত করা হয়, তাহলে সেই ব্লকটি একবারে একটি থ্রেড দ্বারা কার্যকর করা যেতে পারে। সিঙ্ক্রোনাইজেশন বিভিন্ন উপায়ে প্রয়োগ করা যেতে পারে। উদাহরণস্বরূপ, সিঙ্ক্রোনাইজ করার জন্য একটি সম্পূর্ণ পদ্ধতি ঘোষণা করে:

public synchronized void doSomething() {

   // ...Method logic
}
অথবা একটি কোড ব্লক লিখুন যেখানে কিছু বস্তু ব্যবহার করে সিঙ্ক্রোনাইজেশন সঞ্চালিত হয়:

public class Main {

   private Object obj = new Object();

   public void doSomething() {

       // ...Some logic available simultaneously to all threads

       synchronized (obj) {

           // Logic available to just one thread at a time
       }
   }
}
অর্থ সহজ। যদি একটি থ্রেড কীওয়ার্ড দিয়ে চিহ্নিত কোড ব্লকের ভিতরে যায় synchronized, তাহলে এটি অবিলম্বে অবজেক্টের মিউটেক্স ক্যাপচার করে এবং একই ব্লক বা পদ্ধতিতে প্রবেশ করার চেষ্টা করা অন্য সমস্ত থ্রেডগুলি পূর্ববর্তী থ্রেডটি তার কাজ শেষ না হওয়া পর্যন্ত অপেক্ষা করতে বাধ্য হয় এবং মনিটরটি প্রকাশ করে। থ্রেড সিঙ্ক্রোনাইজেশন।  সিঙ্ক্রোনাইজড অপারেটর - 3যাইহোক! কোর্স চলাকালীন, আপনি ইতিমধ্যে এর উদাহরণ দেখেছেন synchronized, কিন্তু সেগুলি অন্যরকম লাগছিল:

public void swap()
{
   synchronized (this)
   {
       // ...Method logic
   }
}
বিষয় আপনার জন্য নতুন. এবং, অবশ্যই, বাক্য গঠনের সাথে বিভ্রান্তি থাকবে। সুতরাং, এটি লেখার বিভিন্ন উপায়ে পরে বিভ্রান্ত হওয়া এড়াতে এখনই এটি মুখস্থ করুন। এটি লেখার এই দুটি উপায় একই জিনিস বোঝায়:

public void swap() {

   synchronized (this)
   {
       // ...Method logic
   }
}


public synchronized void swap() {

   }
}
প্রথম ক্ষেত্রে, আপনি পদ্ধতিটি প্রবেশ করার সাথে সাথে কোডের একটি সিঙ্ক্রোনাইজড ব্লক তৈরি করছেন। এটি thisবস্তুর দ্বারা সিঙ্ক্রোনাইজ করা হয়, অর্থাৎ বর্তমান বস্তু। এবং দ্বিতীয় উদাহরণে, আপনি synchronizedপুরো পদ্ধতিতে কীওয়ার্ড প্রয়োগ করেন। এটি সিঙ্ক্রোনাইজেশনের জন্য ব্যবহৃত বস্তুটিকে স্পষ্টভাবে নির্দেশ করা অপ্রয়োজনীয় করে তোলে। যেহেতু পুরো পদ্ধতিটি কীওয়ার্ড দিয়ে চিহ্নিত করা হয়েছে, তাই ক্লাসের সমস্ত উদাহরণের জন্য পদ্ধতিটি স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ হবে। কোন পথটি ভাল তা নিয়ে আমরা আলোচনায় ডুবে যাব না। আপাতত, আপনার পছন্দের যে কোনো উপায় বেছে নিন :) প্রধান জিনিসটি মনে রাখতে হবে: আপনি একটি পদ্ধতি সিঙ্ক্রোনাইজ করার ঘোষণা করতে পারেন শুধুমাত্র যখন এর সমস্ত যুক্তি এক সময়ে একটি থ্রেড দ্বারা কার্যকর করা হয়। উদাহরণস্বরূপ, নিম্নলিখিত পদ্ধতিটি সিঙ্ক্রোনাইজ করা একটি ভুল হবে doSomething():

public class Main {

   private Object obj = new Object();

   public void doSomething() {

       // ...Some logic available simultaneously to all threads

       synchronized (obj) {

           // Logic available to just one thread at a time
       }
   }
}
আপনি দেখতে পাচ্ছেন, পদ্ধতির অংশে যুক্তি রয়েছে যার সিঙ্ক্রোনাইজেশন প্রয়োজন হয় না। সেই কোডটি একই সময়ে একাধিক থ্রেড দ্বারা চালিত হতে পারে এবং সমস্ত গুরুত্বপূর্ণ স্থানগুলি একটি পৃথক synchronizedব্লকে আলাদা করা হয়। এবং আরো একটি জিনিস. নাম অদলবদল সহ পাঠ থেকে আমাদের উদাহরণ ঘনিষ্ঠভাবে পরীক্ষা করা যাক:

public void swap()
{
   synchronized (this)
   {
       // ...Method logic
   }
}
দ্রষ্টব্য: সিঙ্ক্রোনাইজেশন ব্যবহার করে সঞ্চালিত হয়this। অর্থাৎ একটি নির্দিষ্টMyClassবস্তু ব্যবহার করা। ধরুন আমাদের 2 টি থ্রেড (Thread-1এবংThread-2) এবং শুধুমাত্র একটিMyClass myClassবস্তু আছে। এই ক্ষেত্রে, যদিThread-1কল করা হয়myClass.swap(), বস্তুর মিউটেক্স ব্যস্ত থাকবে, এবংmyClass.swap()মেথডটিThread-2মিউটেক্স রিলিজ হওয়ার জন্য অপেক্ষা করার সময় হ্যাং হয়ে যাবে। MyClassযদি আমাদের 2টি থ্রেড এবং 2টি অবজেক্ট (myClass1এবংথাকেmyClass2, তাহলে আমাদের থ্রেডগুলি সহজেই বিভিন্ন অবজেক্টে সিঙ্ক্রোনাইজ করা পদ্ধতিগুলি চালাতে পারে। প্রথম থ্রেড এটি কার্যকর করে:

myClass1.swap();
দ্বিতীয়টি এটি কার্যকর করে:

myClass2.swap();
এই ক্ষেত্রে, পদ্ধতির synchronizedভিতরের কীওয়ার্ডটি swap()প্রোগ্রামের অপারেশনকে প্রভাবিত করবে না, যেহেতু সিঙ্ক্রোনাইজেশন একটি নির্দিষ্ট বস্তু ব্যবহার করে সঞ্চালিত হয়। এবং পরবর্তী ক্ষেত্রে, আমরা 2 বস্তু আছে. এইভাবে, থ্রেডগুলি একে অপরের জন্য সমস্যা তৈরি করে না। সর্বোপরি, দুটি বস্তুর 2টি ভিন্ন মিউটেক্স রয়েছে এবং একটি অর্জন করা অন্যটি অর্জনের থেকে স্বাধীন

স্ট্যাটিক পদ্ধতিতে সিঙ্ক্রোনাইজেশনের বিশেষ বৈশিষ্ট্য

কিন্তু আপনি যদি একটি স্ট্যাটিক পদ্ধতি সিঙ্ক্রোনাইজ করতে চান ?

class MyClass {
   private static String name1 = "Ally";
   private static String name2 = "Lena";

   public static synchronized void swap() {
       String s = name1;
       name1 = name2;
       name2 = s;
   }

}
মিউটেক্স এখানে কী ভূমিকা পালন করবে তা পরিষ্কার নয়। সর্বোপরি, আমরা ইতিমধ্যে নির্ধারণ করেছি যে প্রতিটি বস্তুর একটি মিউটেক্স রয়েছে। কিন্তু সমস্যা হল পদ্ধতিটিকে কল করার জন্য আমাদের অবজেক্টের প্রয়োজন নেই MyClass.swap(): পদ্ধতিটি স্ট্যাটিক! তো এরপর কি? :/ এখানে আসলে কোন সমস্যা নেই। জাভা-এর নির্মাতারা সবকিছুর যত্ন নেন :) যদি একটি পদ্ধতি যাতে সমালোচনামূলক সমসাময়িক যুক্তি থাকে তা স্ট্যাটিক হয়, তাহলে ক্লাস লেভেলে সিঙ্ক্রোনাইজেশন করা হয়। বৃহত্তর স্পষ্টতার জন্য, আমরা উপরের কোডটি নিম্নরূপ পুনরায় লিখতে পারি:

class MyClass {
   private static String name1 = "Ally";
   private static String name2 = "Lena";

   public static void swap() {

       synchronized (MyClass.class) {
           String s = name1;
           name1 = name2;
           name2 = s;
       }
   }

}
নীতিগতভাবে, আপনি নিজেই এটি ভাবতে পারতেন: যেহেতু কোনও বস্তু নেই, সিঙ্ক্রোনাইজেশন প্রক্রিয়াটি অবশ্যই ক্লাসের মধ্যেই বেক করা উচিত। এবং এটি এমনই: আমরা ক্লাসগুলি সিঙ্ক্রোনাইজ করতে ব্যবহার করতে পারি।
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION