JavaRush /جاوا بلاگ /Random-SD /سلسلي جي هم وقت سازي. جاوا ۾ هم وقت ساز آپريٽر

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

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

ڪيئن هم وقت ساز آپريٽر جاوا ۾ ڪم ڪندو آهي

اچو ته هڪ نئين لفظ سان واقف ٿيون - synchronized . اهو اسان جي ڪوڊ جو هڪ خاص ٽڪرو نشان لڳايو. جيڪڏهن ڪوڊ جي هڪ بلاڪ کي هم وقت سازي ڪيل لفظ سان نشان لڳايو ويو آهي، ان جو مطلب اهو آهي ته بلاڪ هڪ وقت ۾ صرف هڪ سلسلي سان عمل ڪري سگهجي ٿو. هم وقت سازي کي مختلف طريقن سان لاڳو ڪري سگهجي ٿو. مثال طور، هڪ مڪمل هم وقت سازي جو طريقو ٺاهيو:
public synchronized void doSomething() {

   //...method logic
}
يا ڪوڊ جو هڪ بلاڪ لکو جتي ڪجهه اعتراض تي هم وقت سازي ڪئي ويندي آهي:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...some logic available to all threads

       synchronized (obj) {

           //logic that is only available to one thread at a time
       }
   }
}
معنيٰ سادو آهي. جيڪڏهن هڪ ٿريڊ ڪوڊ جي بلاڪ ۾ داخل ٿئي ٿو جيڪو لفظ هم وقت سازي سان نشان لڳل آهي، اهو فوري طور تي اعتراض جي ميوٽڪس حاصل ڪري ٿو، ۽ ٻيا سڀئي موضوع جيڪي ساڳئي بلاڪ يا طريقي ۾ داخل ٿيڻ جي ڪوشش ڪندا آهن، انتظار ڪرڻ تي مجبور ڪيو ويندو آهي جيستائين اڳئين ٿريڊ پنهنجو ڪم مڪمل ڪري ۽ جاري ڪري. نگراني. سلسلي جي هم وقت سازي.  هم وقت ساز آپريٽر - 3ايئن ته! ڪورس جي ليڪچرن ۾ توهان اڳ ۾ ئي هم وقت سازي جا مثال ڏٺا آهن، پر اهي مختلف نظر آيا:
public void swap()
{
   synchronized (this)
   {
       //...method logic
   }
}
موضوع توهان لاءِ نئون آهي، ۽ يقيناً پهرين ۾ نحو سان مونجهارو هوندو. تنهن ڪري، فوري طور تي ياد رکو ته جيئن بعد ۾ لکڻ جي طريقن ۾ پريشان نه ٿئي. انهن ٻن لکڻ جي طريقن جو مطلب ساڳيو آهي:
public void swap() {

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


public synchronized void swap() {

   }
}
پهرين صورت ۾، توهان طريقي سان داخل ٿيڻ تي فوري طور تي ڪوڊ جو هڪ هم وقت ساز بلاڪ ٺاهيو. اهو اعتراض جي ذريعي هم وقت سازي آهي this، اهو آهي، موجوده اعتراض طرفان. ۽ ٻئي مثال ۾ توهان لفظ کي هم وقت سازي پوري طريقي تي لڳايو. ھاڻي ھاڻي ضرورت ناھي ته ڪنھن شئي کي واضح طور تي ظاھر ڪيو وڃي جنھن تي هم وقت سازي ڪئي وڃي. هڪ دفعو مڪمل طريقو هڪ لفظ سان نشان لڳل آهي، اهو طريقو خودڪار طريقي سان ڪلاس جي سڀني شين لاء هم وقت سازي ڪيو ويندو. اچو ته بحث ۾ نه وڃون ته ڪهڙو طريقو بهتر آهي. ھاڻي، اھو چونڊيو جيڪو توھان چاھيو ٿا:) بنيادي شيء ياد رکڻ جي آھي: توھان ھڪڙي طريقي جو اعلان ڪري سگھو ٿا ھڪڙي وقت ۾ مطابقت پذير طريقي سان صرف ان صورت ۾ جڏھن ان جي اندر جا سڀئي منطق ھڪڙي ھڪڙي ھڪڙي ھڪڙي ھڪڙي ھڪڙي ھڪڙي ھڪڙي ھڪڙي ھڪڙي وقت تي عمل ڪيا آھن. مثال طور، هن صورت ۾ doSomething()اهو هڪ نقص هوندو ته طريقي سان هم وقت سازي ڪرڻ:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...some logic available to all threads

       synchronized (obj) {

           //logic that is only available to one thread at a time
       }
   }
}
جئين توهان ڏسي سگهو ٿا، طريقي جو هڪ ٽڪرو منطق تي مشتمل آهي جنهن لاء هم وقت سازي جي ضرورت ناهي. ان ۾ ڪوڊ هڪ ئي وقت ڪيترن ئي موضوعن تي عمل ڪري سگهجي ٿو، ۽ سڀني نازڪ جڳهن کي هڪ الڳ هم وقت سازي واري بلاڪ ڏانهن مختص ڪيو ويو آهي. ۽ هڪ لمحو. اچو ته خوردبيني جي هيٺان اسان جي مثال تي نالن جي بدلي سان ليڪچر مان ڏسو:
public void swap()
{
   synchronized (this)
   {
       //...method logic
   }
}
مهرباني ڪري نوٽ ڪريو: هم وقت سازي کي استعمال ڪندي ڪيو ويندو آهي this. اهو آهي، هڪ خاص اعتراض لاء MyClass. تصور ڪريو ته اسان وٽ 2 سلسلا ( Thread-1۽ Thread-2) ۽ صرف ھڪڙو اعتراض آھي MyClass myClass. انهي صورت ۾، جيڪڏهن Thread-1طريقو سڏيو ويندو آهي myClass.swap()، اعتراض جو ميوٽڪس مصروف هوندو، ۽ Thread-2جڏهن توهان ان کي ڪال ڪرڻ جي ڪوشش ڪندا، myClass.swap()اهو ميوٽڪس جي آزاد ٿيڻ جي انتظار ۾ لٽڪندو. جيڪڏهن اسان وٽ 2 موضوع ۽ 2 شيون آهن MyClass- myClass1۽ myClass2- مختلف شين تي، اسان جا ٿريڊ آساني سان گڏ ڪري سگھن ٿا هم وقت سازي جي طريقن کي. پهريون سلسلو آهي:
myClass1.swap();
ٻيو ڪري ٿو:
myClass2.swap();
انهي صورت ۾، طريقي جي اندر هم وقت سازي ڪيل لفظ swap()پروگرام جي آپريشن کي متاثر نه ڪندو، ڇو ته هم وقت سازي هڪ مخصوص اعتراض تي ڪيو ويندو آهي. ۽ پوئين صورت ۾، اسان وٽ 2 شيون آهن، تنهن ڪري، موضوع هڪ ٻئي لاء مسئلا پيدا نه ڪندا آهن. سڀ کان پوء، ٻه شيون 2 مختلف ميٽيڪس آهن، ۽ انهن جي گرفتاري هڪ ٻئي تي منحصر نه آهي.

جامد طريقن ۾ هم وقت سازي جون خاصيتون

پر ڇا جيڪڏهن توهان کي مستحڪم طريقي سان هم وقت سازي ڪرڻ جي ضرورت آهي؟
class MyClass {
   private static String name1 = "Olya";
   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 = "Olya";
   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