"হ্যালো, অ্যামিগো! আমাদের কাছে একটি প্যানেসিয়া আছে - সমস্ত রোগের নিরাময়। আমরা ইতিমধ্যেই দেখেছি, অনিয়ন্ত্রিত থ্রেড বদলানো একটি সমস্যা।"

"কেন থ্রেডগুলি নিজেরাই ঠিক করতে পারে না কখন পরবর্তী থ্রেডে যেতে হবে? তাদের যা যা করা দরকার তা করুন এবং তারপর সংকেত করুন, «আমি শেষ!»?"

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

"ঠিক আছে। তাহলে সমাধান কি?"

" অন্যান্য থ্রেড ব্লক করা হচ্ছে।  এটি এভাবেই কাজ করে।"

এটা স্পষ্ট হয়ে গেছে যে থ্রেডগুলি একে অপরের সাথে হস্তক্ষেপ করে যখন তারা ভাগ করা বস্তু এবং/অথবা সংস্থানগুলি ব্যবহার করার চেষ্টা করে । ঠিক যেমনটি আমরা কনসোল আউটপুট সহ উদাহরণে দেখেছি: একটি কনসোল রয়েছে এবং এতে সমস্ত থ্রেড আউটপুট রয়েছে। এটা অগোছালো.

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

যখন একটি থ্রেডের অন্য থ্রেডের সাথে ভাগ করা একটি বস্তুর প্রয়োজন হয়, তখন এটি বস্তুর সাথে যুক্ত মিউটেক্স পরীক্ষা করে। যদি মিউটেক্স আনলক করা থাকে, তাহলে থ্রেড এটিকে লক করে (এটিকে «অধিকৃত» হিসেবে চিহ্নিত করে) এবং শেয়ার করা সম্পদ ব্যবহার করা শুরু করে। থ্রেডটি তার ব্যবসা করার পরে, mutex আনলক করা হয় ("উপলভ্য" হিসাবে চিহ্নিত)।

যদি থ্রেড বস্তুটি ব্যবহার করতে চায় এবং mutex লক করা থাকে, তাহলে থ্রেডটি অপেক্ষা করার সময় ঘুমায়। যখন mutex অবশেষে দখলকারী থ্রেড দ্বারা আনলক করা হয়, আমাদের থ্রেড অবিলম্বে এটি লক করবে এবং চলতে শুরু করবে। একটি বাথরুম দরজা সাইন সঙ্গে সাদৃশ্য নিখুঁত।

"তাহলে আমি কিভাবে একটি mutex এর সাথে কাজ করব? আমার কি বিশেষ বস্তু তৈরি করতে হবে?"

"এটি তার চেয়ে অনেক সহজ। জাভা এর নির্মাতারা এই মিউটেক্সটিকে অবজেক্ট ক্লাসে তৈরি করেছেন। তাই আপনাকে এটি তৈরি করতেও হবে না। এটি প্রতিটি অবজেক্টের অংশ। এটি কীভাবে কাজ করে তা এখানে:"

কোড বর্ণনা
class MyClass
{
private String name1 = "Ally";
private String name2 = "Lena";

public void swap()
{
synchronized (this)
{
String s = name1;
name1 = name2;
name2 = s;
}
}
}
সোয়াপ পদ্ধতি name1 এবং name2 ভেরিয়েবলের মান অদলবদল করে।

একই সময়ে দুটি থ্রেড থেকে ডাকা হলে কী ঘটতে পারে?

প্রকৃত কোড এক্সিকিউশন প্রথম থ্রেড কোড দ্বিতীয় থ্রেড কোড
String s1 = name1; //Ally
name1 = name2; //Lena
name2 = s1; //Ally

String s2 = name1; //Lena
name1 = name2; //Ally
name2 = s2; //Lena
String s1 = name1;
name1 = name2;
//other thread is running
name2 = s1;
//the thread waits until the mutex is unlocked

String s2 = name1;
name1 = name2;
//other thread is running
//other thread is running
name2 = s2;
তলদেশের সরুরেখা
ভেরিয়েবলের মান দুইবার অদলবদল করা হয়েছে, তাদের আসল জায়গায় ফিরে এসেছে।

কিওয়ার্ড  সিঙ্ক্রোনাইজ করার দিকে মনোযোগ দিন ।

"হ্যাঁ, মানে কি?"

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

যদি mutex দখল করা হয়, তাহলে আমাদের থ্রেড স্থির থাকবে এবং এটি খালি করার জন্য অপেক্ষা করবে।

"এত সহজ এবং এত মার্জিত। এটি একটি সুন্দর সমাধান।"

"হ্যাঁ। কিন্তু এই ক্ষেত্রে কি হবে বলে মনে করেন?"

কোড বর্ণনা
class MyClass
{
private String name1 = "Ally";
private String name2 = "Lena";

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

public void swap2()
{
synchronized (this)
{
String s = name1;
name1 = name2;
name2 = s;
}
}
}
swap এবং swap2 পদ্ধতি একই মিউটেক্স ( এই বস্তুটি) ভাগ করে।

কি হবে যদি একটি থ্রেড সোয়াপ পদ্ধতিতে কল করে এবং অন্য থ্রেডটি swap2 পদ্ধতিতে কল করে?

"যেহেতু মিউটেক্স একই, দ্বিতীয় থ্রেডটিকে অপেক্ষা করতে হবে যতক্ষণ না প্রথম থ্রেডটি সিঙ্ক্রোনাইজড ব্লক ছেড়ে যায়। তাই একই সাথে অ্যাক্সেসের সাথে কোন সমস্যা হবে না।"

"শাবাশ, আমিগো! এটাই সঠিক উত্তর!"

এখন আমি উল্লেখ করতে চাই যে সিঙ্ক্রোনাইজড শুধুমাত্র কোডের ব্লক নয়, পদ্ধতিগুলিও চিহ্নিত করতে ব্যবহার করা যেতে পারে। এখানে এর অর্থ কী:

কোড আসলেই কি হয়
class MyClass
{
private static String name1 = "Ally";
private static String name2 = "Lena";

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

public static synchronized void swap2()
{
String s = name1;
name1 = name2;
name2 = s;
}
}
class MyClass
{
private static String name1 = "Ally";
private static String name2 = "Lena";

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

public static void swap2()
{
synchronized (MyClass.class)
{
String s = name1;
name1 = name2;
name2 = s;
}
}