CodeGym /جاوا بلاگ /Random-UR /تھریڈ سنکرونائزیشن۔ مطابقت پذیر آپریٹر
John Squirrels
سطح
San Francisco

تھریڈ سنکرونائزیشن۔ مطابقت پذیر آپریٹر

گروپ میں شائع ہوا۔
ہائے! آج ہم ملٹی تھریڈ پروگرامنگ کی خصوصیات پر غور کرتے رہیں گے اور تھریڈ سنکرونائزیشن کے بارے میں بات کریں گے۔ تھریڈ سنکرونائزیشن۔  مطابقت پذیر آپریٹر - 1

جاوا میں مطابقت پذیری کیا ہے؟

پروگرامنگ ڈومین کے باہر، اس کا مطلب ایک ایسا انتظام ہے جو دو آلات یا پروگراموں کو ایک ساتھ کام کرنے کی اجازت دیتا ہے۔ مثال کے طور پر، ایک سمارٹ فون اور کمپیوٹر کو گوگل اکاؤنٹ کے ساتھ ہم آہنگ کیا جا سکتا ہے، اور ویب سائٹ اکاؤنٹ کو سوشل نیٹ ورک اکاؤنٹس کے ساتھ ہم آہنگ کیا جا سکتا ہے تاکہ آپ انہیں سائن ان کرنے کے لیے استعمال کر سکیں۔ ایک دوسرے. پچھلے اسباق میں، ہمارے دھاگے ایک دوسرے سے الگ رہتے اور کام کرتے تھے۔ ایک نے حساب لگایا، دوسرا سو گیا، اور تیسرے نے کنسول پر کچھ دکھایا، لیکن انہوں نے بات چیت نہیں کی۔ حقیقی پروگراموں میں ایسے حالات بہت کم ہوتے ہیں۔ ایک سے زیادہ تھریڈز ایک ہی ڈیٹا سیٹ کے ساتھ فعال طور پر کام کر سکتے ہیں اور اس میں ترمیم کر سکتے ہیں۔ اس سے مسائل پیدا ہوتے ہیں۔ ایک ہی جگہ پر متن لکھنے والے متعدد تھریڈز کا تصور کریں، مثال کے طور پر، ٹیکسٹ فائل یا کنسول پر۔ اس صورت میں، فائل یا کنسول ایک مشترکہ وسیلہ بن جاتا ہے۔ تھریڈز ایک دوسرے کے وجود سے ناواقف ہیں، اس لیے وہ دھاگے کے شیڈیولر کی طرف سے دیے گئے وقت میں وہ سب کچھ لکھتے ہیں جو وہ کر سکتے ہیں۔ ایک حالیہ سبق میں، ہم نے ایک مثال دیکھی کہ یہ کہاں لے جاتا ہے۔ آئیے اب اسے یاد کرتے ہیں: تھریڈ سنکرونائزیشن۔  مطابقت پذیر آپریٹر - 2اس کی وجہ یہ ہے کہ تھریڈز ایک دوسرے کے ساتھ اپنے اعمال کو مربوط کیے بغیر مشترکہ وسائل (کنسول) کے ساتھ کام کر رہے ہیں۔ اگر تھریڈ شیڈیولر Thread-1 کے لیے وقت مختص کرتا ہے، تو یہ فوری طور پر کنسول پر سب کچھ لکھ دیتا ہے۔ دوسرے تھریڈز میں کیا ہے یا پہلے ہی لکھنے میں کامیاب نہیں ہوئے اس سے کوئی فرق نہیں پڑتا۔ نتیجہ، جیسا کہ آپ دیکھ سکتے ہیں، مایوس کن ہے۔ اسی لیے انہوں نے ملٹی تھریڈ پروگرامنگ کے لیے ایک خاص تصور، mutex (باہمی اخراج) متعارف کرایا۔ ایک mutex کا مقصد ایک میکانزم فراہم کرنا ہے تاکہ ایک مخصوص وقت میں صرف ایک دھاگے کو کسی چیز تک رسائی حاصل ہو۔ اگر Thread-1 آبجیکٹ A کا mutex حاصل کرتا ہے، تو دوسرے تھریڈز آبجیکٹ تک رسائی اور ترمیم نہیں کر سکیں گے۔ دوسرے تھریڈز کو اس وقت تک انتظار کرنا چاہیے جب تک کہ آبجیکٹ A کا mutex جاری نہ ہو جائے۔ یہاں زندگی سے ایک مثال ہے: تصور کریں کہ آپ اور 10 دیگر اجنبی ایک مشق میں حصہ لے رہے ہیں۔ موڑ لیتے ہوئے، آپ کو اپنے خیالات کا اظہار کرنے اور کچھ بات کرنے کی ضرورت ہے۔ لیکن چونکہ آپ ایک دوسرے کو پہلی بار دیکھ رہے ہیں، ایک دوسرے کو مسلسل مداخلت کرنے اور غصے میں نہ اڑنے کے لیے، آپ 'ٹاکنگ بال' استعمال کرتے ہیں: صرف گیند والا ہی بول سکتا ہے۔ اس طرح آپ ایک اچھی اور نتیجہ خیز گفتگو کرتے ہیں۔ بنیادی طور پر، گیند ایک mutex ہے. اگر کسی شے کا mutex ایک دھاگے کے ہاتھ میں ہے، تو دوسرے دھاگے آبجیکٹ کے ساتھ کام نہیں کر سکتے۔ mutex بنانے کے لیے آپ کو کچھ کرنے کی ضرورت نہیں ہے: یہ پہلے سے ہی Objectکلاس میں بنا ہوا ہے، جس کا مطلب ہے کہ جاوا میں ہر شے کے پاس ایک ہے۔

مطابقت پذیر آپریٹر کیسے کام کرتا ہے۔

آئیے ایک نئے کلیدی لفظ کو جانتے ہیں: synchronized ۔ یہ کوڈ کے ایک مخصوص بلاک کو نشان زد کرنے کے لیے استعمال کیا جاتا ہے۔ اگر ایک کوڈ بلاک کو 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، تو یہ فوری طور پر آبجیکٹ کے mutex کو پکڑ لیتا ہے، اور اسی بلاک یا طریقہ میں داخل ہونے کی کوشش کرنے والے دیگر تمام تھریڈز کو انتظار کرنے پر مجبور کیا جاتا ہے جب تک کہ پچھلا تھریڈ اپنا کام مکمل نہیں کر لیتا اور مانیٹر جاری کر دیتا ہے۔ تھریڈ سنکرونائزیشن۔  مطابقت پذیر آپریٹر - 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()، تو آبجیکٹ کا mutex مصروف ہو جائے گا، اور جبmyClass.swap()طریقہThread-2تو mutex کے جاری ہونے کا انتظار کرتے ہوئے لٹک جائے گا۔ اگر ہمارے پاس 2 تھریڈز اور 2MyClassآبجیکٹ (myClass1اورmyClass2) ہوں گے تو ہمارے تھریڈز آسانی سے بیک وقت مختلف اشیاء پر مطابقت پذیر طریقوں کو انجام دے سکتے ہیں۔ پہلا تھریڈ اس پر عمل کرتا ہے:
myClass1.swap();
دوسرا اس پر عمل کرتا ہے:
myClass2.swap();
اس صورت میں، طریقہ synchronizedکے اندر مطلوبہ لفظ swap()پروگرام کے عمل کو متاثر نہیں کرے گا، کیونکہ مطابقت پذیری ایک مخصوص چیز کا استعمال کرتے ہوئے کی جاتی ہے۔ اور مؤخر الذکر صورت میں، ہمارے پاس 2 اشیاء ہیں۔ اس طرح، دھاگے ایک دوسرے کے لیے مسائل پیدا نہیں کرتے ہیں۔ سب کے بعد، دو اشیاء کے 2 مختلف mutexes ہیں، اور ایک کو حاصل کرنا دوسرے کو حاصل کرنے سے آزاد ہے ۔

جامد طریقوں میں مطابقت پذیری کی خصوصی خصوصیات

لیکن کیا ہوگا اگر آپ کو جامد طریقہ کو ہم آہنگ کرنے کی ضرورت ہو ؟
class MyClass {
   private static String name1 = "Ally";
   private static String name2 = "Lena";

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

}
یہ واضح نہیں ہے کہ mutex یہاں کیا کردار ادا کرے گا۔ بہر حال، ہم نے پہلے ہی طے کر لیا ہے کہ ہر شے کا ایک mutex ہوتا ہے۔ لیکن مسئلہ یہ ہے کہ ہمیں 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