CodeGym /جاوا بلاگ /Random-SD /سلسلي جي هم وقت سازي. هم وقت ساز آپريٽر
John Squirrels
سطح
San Francisco

سلسلي جي هم وقت سازي. هم وقت ساز آپريٽر

گروپ ۾ شايع ٿيل
سلام اڄ اسين ملٽي ٿريڊ پروگرامنگ جي خصوصيتن تي غور ڪندا رهنداسين ۽ ٿريڊ سنڪرونائيزيشن بابت ڳالهائينداسين. سلسلي جي هم وقت سازي.  هم وقت ساز آپريٽر - 1

جاوا ۾ هم وقت سازي ڇا آهي؟

پروگرامنگ ڊومين جي ٻاهران، اهو هڪ ترتيب جو مطلب آهي جيڪو ٻن ڊوائيسز يا پروگرامن کي گڏجي ڪم ڪرڻ جي اجازت ڏئي ٿو. مثال طور، هڪ اسمارٽ فون ۽ ڪمپيوٽر کي گوگل اڪائونٽ سان هم وقت سازي ڪري سگهجي ٿو، ۽ هڪ ويب سائيٽ اڪائونٽ کي سوشل نيٽ ورڪ اڪائونٽس سان هم وقت سازي ڪري سگهجي ٿو، تنهنڪري توهان انهن کي سائن ان ڪرڻ لاءِ استعمال ڪري سگهو ٿا. ٿريڊ جي هم وقت سازيءَ جي هڪجهڙائي آهي: اهو هڪ ترتيب آهي جنهن ۾ ٿريڊس سان رابطو ڪن ٿا. هر هڪ. پوئين سبقن ۾، اسان جا سلسلا رهندا هئا ۽ هڪ ٻئي کان الڳ ڪم ڪندا هئا. هڪ هڪ حساب ڪيو، ٻيو سمهيو، ۽ ٽيون ڪنسول تي ڪجهه ڏيکاريو، پر انهن سان رابطو نه ڪيو. حقيقي پروگرامن ۾، اهڙيون حالتون نادر آهن. گھڻن موضوعن کي فعال طور تي ڪم ڪري سگھي ٿو ۽ ساڳئي ڊيٽا سيٽ کي تبديل ڪري سگھي ٿو. هي مسئلا پيدا ڪري ٿو. تصور ڪريو ڪيترن ئي موضوعن تي متن لکڻ جي ھڪڙي جڳھ تي، مثال طور، ھڪڙي ٽيڪسٽ فائل يا ڪنسول ڏانھن. انهي صورت ۾، فائل يا ڪنسول هڪ گڏيل وسيلو بڻجي ويندو آهي. ٿريڊس هڪ ٻئي جي وجود کان بي خبر آهن، ان ڪري اهي ٿريڊ شيڊيولر طرفان انهن کي ڏنل وقت ۾ سڀ ڪجهه لکن ٿا. هڪ تازي سبق ۾، اسان هڪ مثال ڏٺو ته اهو ڪٿي وڃي ٿو. اچو ته ان کي هاڻي ياد ڪريون: سلسلي جي هم وقت سازي.  هم وقت سازي آپريٽر - 2ان جو سبب ان حقيقت ۾ آهي ته موضوع هڪ گڏيل وسيلن (ڪنسول) سان ڪم ڪري رهيا آهن بغير انهن جي عملن کي هڪ ٻئي سان گڏ ڪرڻ جي. جيڪڏهن ٿريڊ شيڊيولر Thread-1 لاءِ وقت مختص ڪري ٿو، پوءِ اهو فوري طور تي سڀ ڪجهه ڪنسول ڏانهن لکي ٿو. ٻيا ڪهڙا موضوع آهن يا اڳ ۾ ئي لکڻ لاءِ منظم نه ٿيا آهن ان سان ڪو فرق نٿو پوي. نتيجو، جيئن توهان ڏسي سگهو ٿا، اداس آهي. اهو ئي سبب آهي ته انهن هڪ خاص تصور متعارف ڪرايو، ميوٽڪس (باہمي خارج ڪرڻ) ، ملٽي ٿريڊ پروگرامنگ ڏانهن. ميوٽيڪس جو مقصد هڪ ميکانيزم مهيا ڪرڻ آهي ته جيئن صرف هڪ ڌاڳو هڪ خاص وقت تي ڪنهن شئي تائين رسائي حاصل ڪري. جيڪڏهن Thread-1 اعتراض A جي ميوٽيڪس حاصل ڪري ٿي، ٻيا موضوع اعتراض تائين رسائي ۽ تبديل ڪرڻ جي قابل نه هوندا. ٻين موضوعن کي انتظار ڪرڻو پوندو جيستائين اعتراض A جي ميوٽڪس کي آزاد ڪيو وڃي. هتي زندگي مان هڪ مثال آهي: تصور ڪريو ته توهان ۽ 10 ٻيا اجنبي هڪ مشق ۾ حصو وٺي رهيا آهيو. موڙ کڻڻ، توهان کي پنهنجي خيالن جو اظهار ڪرڻ ۽ ڪجهه بحث ڪرڻ جي ضرورت آهي. پر ڇاڪاڻ ته توهان هڪ ٻئي کي پهريون ڀيرو ڏسي رهيا آهيو، هڪ ٻئي کي مسلسل مداخلت نه ڪرڻ ۽ ڪاوڙ ۾ پرواز ڪرڻ لاء، توهان هڪ 'ڳالهائيندڙ بال' استعمال ڪندا آهيو: صرف بال سان ماڻهو ڳالهائي سگهي ٿو. هن طريقي سان توهان هڪ سٺو ۽ مفيد بحث ختم ڪيو. لازمي طور تي، بال هڪ ميوٽڪس آهي. جيڪڏهن ڪنهن شئي جو ميوٽڪس هڪ ٿريڊ جي هٿ ۾ آهي، ته ٻيا سلسلا ان شئي سان ڪم نٿا ڪري سگهن. توهان کي ميٽيڪس ٺاهڻ لاءِ ڪجهه ڪرڻ جي ضرورت ناهي: اهو اڳ ۾ ئي 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لفظ سان نشان لڳل آهي، اهو فوري طور تي اعتراض جي ميوٽڪس کي پڪڙي ٿو، ۽ ساڳئي بلاڪ يا طريقي ۾ داخل ٿيڻ جي ڪوشش ڪندڙ ٻيا سڀ ٿريڊ انتظار ڪرڻ تي مجبور آهن جيستائين اڳوڻو ٿريڊ پنهنجو ڪم مڪمل ڪري ۽ مانيٽر جاري ڪري. سلسلي جي هم وقت سازي.  هم وقت سازي آپريٽر - 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