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

পূর্বে, আমরা একটি প্রোগ্রামকে অবজেক্টের একটি সেট হিসাবে দেখতাম যা একে অপরের পদ্ধতিকে কল করে। এখন সবকিছু একটু বেশি জটিল হয়ে গেছে। একটি প্রোগ্রাম অনেকটা অবজেক্টের সেটের মতো যার মধ্যে বেশ কিছু "ছোট রোবট" (থ্রেড) ক্রল করে এবং পদ্ধতিতে থাকা কমান্ডগুলি কার্যকর করে।

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

একটি প্রোগ্রাম আরও জটিল হয়ে উঠছে। বিভিন্ন থ্রেড বিভিন্ন বস্তুর অবস্থা পরিবর্তন করে যা তারা সঞ্চালিত কাজের উপর ভিত্তি করে। এবং তারা একে অপরের পায়ের আঙ্গুলের উপর পা রাখতে পারে।

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

প্রথম থ্রেড কোড দ্বিতীয় থ্রেড কোড
System.out.print ("Nick is");
System.out.print ("");
System.out.print ("15");
System.out.print ("");
System.out.print ("years old");
System.out.println ();
System.out.print ("Lena is");
System.out.print ("");
System.out.print ("21");
System.out.print ("");
System.out.print ("years old");
System.out.println ();
আমরা প্রদর্শিত হবে কি আশা
নিক 15 বছর বয়সী
লেনা 21 বছর বয়সী
প্রকৃত কোড এক্সিকিউশন প্রথম থ্রেড কোড দ্বিতীয় থ্রেড কোড
System.out.print ("Nick is");
System.out.print ("Lena is");
System.out.print (" ");
System.out.print (" ");
System.out.print ("15");
System.out.print ("21");
System.out.print (" ");
System.out.print (" ");
System.out.print ("years old");
System.out.println ();
System.out.print ("years old");
System.out.println ();
System.out.print ("Nick is");
//other thread is running
//other thread is running
System.out.print (" ");
System.out.print ("15");
//other thread is running
//other thread is running
System.out.print (" ");
System.out.print ("years old");
System.out.println ();
//other thread is running
//other thread is running
//other thread is running
System.out.print ("Lena is");
System.out.print (" ");
//other thread is running
//other thread is running
System.out.print ("21");
System.out.print (" ");
//other thread is running
//other thread is running
//other thread is running
System.out.print ("years old");
System.out.println ();
আসলে কি প্রদর্শিত হয়
নিক হল  লেনা   15  21  বছর
বয়সী

এবং এখানে আরেকটি উদাহরণ:

কোড বর্ণনা
class MyClass
{
private String name1 = "Ally";
private String name2 = "Lena";
public void swap()
{
String s = name1;
name1 = name2;
name2 = s;
}
}
অদলবদল পদ্ধতি এবং ভেরিয়েবলের swapমান ।name1name2

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

প্রকৃত কোড এক্সিকিউশন প্রথম থ্রেড কোড দ্বিতীয় থ্রেড কোড
String s1 = name1; //Ally
name1 = name2; //Lena
String s2 = name1; //Lena(!)
name1 = name2; //Lena
name2 = s1; //Ally
name2 = s2; //Lena
String s1 = name1;
name1 = name2;
//other thread is running
//other thread is running
name2 = s1;
//other thread is running
//other thread is running
//other thread is running
String s2 = name1;
name1 = name2;
//other thread is running
name2 = s2;
তলদেশের সরুরেখা
উভয় ভেরিয়েবলের "লেনা" মান আছে।
"মিত্র" বস্তুটি এটি তৈরি করেনি। এটা হারিয়ে গেছে।

"কে অনুমান করতে পারে যে এইরকম একটি সাধারণ অ্যাসাইনমেন্ট অপারেশনের মাধ্যমে এর মতো ত্রুটিগুলি সম্ভব?!"

"হ্যাঁ, এই সমস্যার সমাধান আছে। তবে আমরা এই বিষয়ে একটু পরে কথা বলব - আমার গলা শুকিয়ে গেছে।"