سلام! جاوا رش ۾ ملٽي ٿريڊنگ پڙهڻ دوران، توهان اڪثر ”ميوٽڪس“ ۽ ”مانيٽر“ جي تصورن ۾ ايندا آهيو. ڇا تون ھاڻي، بغير جھڪائڻ جي، جواب ڏئي سگھين ٿو ته اھي ڪيئن مختلف آھن؟ :)
جيڪڏهن توهان ڪري سگهو ٿا، سٺو ڪيو! جيڪڏهن نه (۽ اڪثر ڪري ائين ٿئي ٿو) - تعجب ناهي. "mutex" ۽ "مانيٽر" جا تصور حقيقت سان لاڳاپيل آهن. ان کان علاوه، انٽرنيٽ تي ٻاهرين وسيلن تي ملٽي ٿريڊنگ تي ليڪچر پڙهڻ ۽ وڊيوز ڏسڻ دوران، توهان کي هڪ ٻيو ساڳيو تصور ملندو - "سيمفور". ان جي ڪارڪردگي پڻ گهڻو ڪري هڪ مانيٽر ۽ ميوٽڪس وانگر آهي. تنهن ڪري، اچو ته انهن ٽنهي اصطلاحن کي سمجهون، ڪجهه مثالن کي ڏسو ۽ آخر ۾ اسان جي سرن ۾ منظم ڪريون ته اهي هڪ ٻئي کان ڪيئن مختلف آهن :)
ٻين لفظن ۾، هڪ وقت ۾ صرف هڪ موضوع گڏيل وسيلن تي ڪم ڪري سگهي ٿو. ٻين موضوعن (ماڻهن) پاران قبضو ڪيل وسيلن تائين رسائي جي ڪوشش ناڪام ٿيندي. هڪ mutex ڪيترن ئي اهم خاصيتون آهن. پهرين ، صرف ٻه رياستون ممڪن آهن - "مفت" ۽ "مصروف". هي اهو سمجهڻ آسان بڻائي ٿو ته اهو ڪيئن ڪم ڪري ٿو: متوازي ٺاهي سگھجن ٿيون Boolean variables true/false يا بائنري نمبر سسٽم 1/0 سان. ٻيو ، رياستن کي سڌو سنئون ڪنٽرول نٿو ڪري سگهجي. جاوا ۾ ڪي به ميکانيزم نه آهن جيڪي توهان کي واضح طور تي هڪ اعتراض کڻڻ جي اجازت ڏين ٿا، ان جي ميوٽڪس حاصل ڪريو ۽ ان کي گهربل حيثيت ڏيو. ٻين لفظن ۾، توهان ڪجهه نه ٿا ڪري سگهو جهڙوڪ:
جاوا ۾ سيمفورس ڪلاس جي نمائندگي ڪن ٿا
اسان بهتر سمجھڻ لاءِ ان جي اصطلاحن کي ٿورو آسان ڪنداسين. تصور ڪريو اسان وٽ 5 فلسفي آھن جن کي لنچ جي ضرورت آھي. ساڳئي وقت، اسان وٽ هڪ ميز آهي، ۽ هڪ ئي وقت ۾ ٻه کان وڌيڪ ماڻهو نه هوندا. اسان جو ڪم سڀني فلسفين کي کارائڻ آهي. انهن مان نه ته بک مرڻ گهرجي، ۽ نه ئي انهن کي هڪ ٻئي کي ”بلاڪ“ ڪرڻ گهرجي جڏهن ميز تي ويهڻ جي ڪوشش ڪئي وڃي (اسان کي لازمي طور تي تعطل کان پاسو ڪرڻ گهرجي). اسان جو فلسفي طبقو اهو ئي نظر ايندو:
![هڪ ميوٽڪس، هڪ مانيٽر ۽ سيمفور جي وچ ۾ ڇا فرق آهي - 5]()
ميٽيڪس
ميوٽيڪس هڪ خاص شئي آهي جيڪو ٿريڊز کي هم وقت سازي ڪرڻ لاءِ. اهو جاوا ۾ هر شئي سان "منسلڪ" آهي - توهان اڳ ۾ ئي ڄاڻو ٿا ته :) اهو مسئلو ناهي ته توهان معياري ڪلاس استعمال ڪندا آهيو يا پنهنجا پنهنجا ڪلاس ٺاهيندا آهيو، چئو،Cat
۽ Dog
: سڀني طبقن جي سڀني شين جو هڪ ميوٽڪس آهي . نالو "mutex" انگريزيء مان اچي ٿو "MUTual EXclusion" - "باہمي خارج ٿيڻ"، ۽ اهو مڪمل طور تي ان جي مقصد کي ظاهر ڪري ٿو. جيئن ته اسان اڳئين ليڪچرن مان هڪ ۾ چيو آهي ته، ميٽيڪس جو ڪم هڪ اهڙي ميکانيزم کي مهيا ڪرڻ آهي ته جيئن صرف هڪ ڌاڳو هڪ خاص وقت تي ڪنهن شئي تائين رسائي ڪري سگهي . حقيقي زندگي ۾ ميوٽڪس لاءِ هڪ مشهور تشبيهه ”ٽائلٽ مثال“ آهي. جڏهن ڪو ماڻهو ٽوائلٽ ۾ داخل ٿئي ٿو، هو اندر کان دروازو بند ڪري ٿو. ٽوائلٽ هڪ اعتراض جي طور تي ڪم ڪري ٿو جيڪو ڪيترن ئي موضوعن ذريعي پهچائي سگهجي ٿو. ٽوائلٽ جي دروازي تي تالا هڪ ميوٽيڪل جو ڪردار آهي، ۽ ٻاهران ماڻهن جي قطار موضوعن جو ڪردار آهي. دروازي تي تالا هڪ ٽوائلٽ ميوٽڪس آهي: اهو يقيني بڻائي ٿو ته صرف هڪ شخص اندر ٿي سگهي ٿو هڪ وقت ۾. ![هڪ ميوٽڪس، هڪ مانيٽر ۽ سيمفور جي وچ ۾ ڇا فرق آهي - 2](https://cdn.javarush.com/images/article/2af6a4b9-893f-44e3-8c31-d584a0ae27c8/1024.jpeg)
Object myObject = new Object();
Mutex mutex = myObject.getMutex();
mutex.free();
اهڙيء طرح، اعتراض جي ميوٽڪس کي آزاد نه ٿو ڪري سگهجي. صرف جاوا مشين ان تائين سڌو رسائي آهي. پروگرامر زباني اوزار استعمال ڪندي ميٽيڪس سان ڪم ڪن ٿا.
مانيٽر
هڪ مانيٽر هڪ ميوٽڪس ڏانهن اضافي "اضافو" آهي. حقيقت ۾، مانيٽر ڪوڊ جو هڪ ٽڪرو آهي "پوشيده" پروگرامر ڏانهن . اڳ ۾ ميٽيڪس بابت ڳالهائيندي، اسان هڪ سادي مثال ڏنو: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
}
}
}
ڪوڊ جي بلاڪ ۾ جيڪو لفظ سان نشان لڳل آهي synchronized
، اسان جي اعتراض جي ميوٽڪس تي قبضو ڪيو ويو آهي obj
. ٺيڪ آهي، گرفتاري ٿئي ٿي، پر ڪيئن "دفاعي ميکانيزم" حاصل ڪيو ويو آهي؟ synchronized
ٻيو ٿريڊ بلاڪ جي اندر ڇو نٿو وڃي سگهي جڏهن اهي هڪ لفظ ڏسن ٿا ؟ اهو مانيٽر آهي جيڪو حفاظتي ميڪانيزم ٺاهي ٿو! مرتب ڪندڙ لفظ کي synchronized
ڪوڊ جي ڪيترن ئي خاص ٽڪرن ۾ تبديل ڪري ٿو. هڪ دفعو ٻيهر اچو ته اسان جي مثال ڏانهن موٽڻ جي طريقي سان doSomething()
۽ ان کي شامل ڪريو:
public class Main {
private Object obj = new Object();
public void doSomething() {
//...some logic available to all threads
//logic that is only available to one thread at a time
synchronized (obj) {
/*выполнить важную работу, при которой доступ к an objectу
должен быть только у одного потока*/
obj.someImportantMethod();
}
}
}
ھتي اھو آھي جيڪو اسان جي پروگرام جي "ھيڊ جي ھيٺان" ٿيڻ کان پوء ٺاھيندڙ ھن ڪوڊ کي تبديل ڪري ٿو:
public class Main {
private Object obj = new Object();
public void doSomething() throws InterruptedException {
//...some logic available to all threads
//логика, которая одновременно доступна только для одного потока:
/*до тех пор, пока мьютекс an object занят -
любой другой поток (кроме того, который его захватил), спит*/
while (obj.getMutex().isBusy()) {
Thread.sleep(1);
}
//пометить мьютекс an object How занятый
obj.getMutex().isBusy() = true;
/*выполнить важную работу, при которой доступ к an objectу
должен быть только у одного потока*/
obj.someImportantMethod();
//освободить мьютекс an object
obj.getMutex().isBusy() = false;
}
}
مثال، يقينا، حقيقي ناهي. هتي، جاوا-جهڙو ڪوڊ استعمال ڪندي، اسان اهو ظاهر ڪرڻ جي ڪوشش ڪئي ته هن وقت جاوا مشين اندر ڇا ٿي رهيو آهي. بهرحال، هي pseudocode هڪ وڏي سمجھ ڏئي ٿو ته اصل ۾ ڇا ٿي رهيو آهي بلاڪ جي اندر اعتراض ۽ موضوعن سان synchronized
۽ ڪئين ڪمپلر هن لفظ کي ڪيترن ئي حڪمن ۾ تبديل ڪري ٿو جيڪي پروگرامر کي "پوشيده" آهن. لازمي طور تي، جاوا ۾ مانيٽر لفظ استعمال ڪندي ظاهر ڪيو ويو آهيsynchronized
. سڀ ڪوڊ جيڪو ظاهر ٿيو لفظ جي بدران synchronized
آخري مثال مانيٽر آهي.
سيمفور
ٻيو لفظ جيڪو توهان کي نظر اچي ٿو جڏهن توهان پنهنجي پاڻ تي ملٽي ٿريڊنگ پڙهندا آهيو ”سيمفور“. اچو ته اهو معلوم ڪيو ته اهو ڇا آهي ۽ اهو ڪيئن مختلف آهي مانيٽر ۽ هڪ ميوٽڪس کان. هڪ سيمفور هڪ وسيلن تائين رسائي کي هم وقت سازي ڪرڻ جو هڪ وسيلو آهي. ان جي خاصيت اها آهي ته اهو هڪ انسداد استعمال ڪري ٿو جڏهن هڪ هم وقت سازي ميڪانيزم ٺاهي ٿي. ڪائونٽر اسان کي ٻڌائي ٿو ته ڪيترا سلسلا هڪ ئي وقت هڪ گڏيل وسيلن تائين رسائي ڪري سگهن ٿا.![هڪ ميوٽڪس، هڪ مانيٽر ۽ سيمفور جي وچ ۾ ڇا فرق آهي - 3](https://cdn.javarush.com/images/article/532cb267-686d-430d-aacc-1539d2eb9ffc/1024.jpeg)
Semaphore
. جڏهن سيمفور شيون ٺاهي رهيا آهيون، اسان هيٺ ڏنل تعمير ڪندڙ استعمال ڪري سگهون ٿا:
Semaphore(int permits)
Semaphore(int permits, boolean fair)
اسان ٺاھيندڙ ڏانھن وڃو:
-
int permits
- شروعاتي ۽ وڌ ۾ وڌ انسداد قيمت. اهو آهي، ڪيترا موضوع هڪ ئي وقت ۾ هڪ گڏيل وسيلن تائين رسائي ڪري سگهن ٿا؛ -
boolean fair
- ترتيب قائم ڪرڻ لاءِ جنهن ۾ سلسلا رسائي حاصل ڪندا. جيڪڏھنfair
= سچو ، رسائي ڏني وئي آھي انتظار جي سلسلي کي ان ترتيب ۾ جنھن ۾ انھن درخواست ڪئي ھئي. جيڪڏهن اهو غلط آهي ، آرڊر ٿريڊ شيڊيولر طرفان طئي ڪيو ويندو.
![هڪ ميوٽڪس، هڪ مانيٽر ۽ سيمفور جي وچ ۾ ڇا فرق آهي - 4](https://cdn.javarush.com/images/article/433e2831-8242-4394-99c1-c902994a7fce/1024.jpeg)
class Philosopher extends Thread {
private Semaphore sem;
// поел ли философ
private boolean full = false;
private String name;
Philosopher(Semaphore sem, String name) {
this.sem=sem;
this.name=name;
}
public void run()
{
try
{
// если философ еще не ел
if (!full) {
//Запрашиваем у семафора разрешение на выполнение
sem.acquire();
System.out.println (name + " садится за стол");
// философ ест
sleep(300);
full = true;
System.out.println (name + " поел! Он выходит из-за стола");
sem.release();
// философ ушел, освободив место другим
sleep(300);
}
}
catch(InterruptedException e) {
System.out.println ("What-то пошло не так!");
}
}
}
۽ هتي اسان جي پروگرام کي هلائڻ لاء ڪوڊ آهي:
public class Main {
public static void main(String[] args) {
Semaphore sem = new Semaphore(2);
new Philosopher(sem,"Сократ").start();
new Philosopher(sem,"Платон").start();
new Philosopher(sem,"Аристотель").start();
new Philosopher(sem,"Фалес").start();
new Philosopher(sem,"Пифагор").start();
}
}
اسان 2 جي ڳڻپ سان هڪ سيمفور ٺاهيو ان شرط کي پورو ڪرڻ لاءِ ته صرف ٻه فيلسوف هڪ ئي وقت کائي سگهن. يعني رڳو ٻه سلسلا هڪ ئي وقت ڪم ڪري سگهن ٿا، ڇو ته اسان جي طبقي کي Philosopher
ورثي ۾ مليل آهي Thread
! طبقن acquire()
۽ طريقن کي ڪنٽرول ان جي اجازت انسداد. طريقو سيمفور کان وسيلن تائين رسائي جي اجازت جي درخواست ڪري ٿو. جيڪڏهن counter> 0، اجازت ڏني ويندي آهي ۽ ڪائونٽر کي 1 کان گهٽايو ويندو آهي. طريقو اڳ ۾ ڏنل اجازت کي "ريليز" ڪري ٿو ۽ ان کي ڪائونٽر ڏانهن واپس ڪري ٿو (سيمفور جي گرانٽ ڪائونٽر کي 1 کان وڌايو). اسان کي ڇا حاصل ٿيندو جڏهن اسان پروگرام هلائيندا آهيون؟ ڇا مسئلو حل ٿي ويو آهي ڇا اسان جا فلاسافر پنهنجي موڙ جي انتظار ۾ وڙهندا؟ :) هي اهو آهي جيڪو اسان کي مليو آهي ڪنسول جو نتيجو: سقراط ميز تي ويٺو آهي افلاطون ميز تي ويٺو آهي سقراط کاڌو آهي! هو ميز ڇڏي ٿو، افلاطون کاڌو آهي! هو ميز ڇڏي ٿو ارسطو ميز تي ويٺو آهي پيٿاگورس ميز تي ويٺو آهي ارسطو کاڌو آهي! هو ٽيبل ڇڏي ٿو ته پٿگورس کائي چڪو آهي! ھو ٽيبل ڇڏي ٿو تھلس ٽيبل تي ويٺو آھي تھلس کاڌو آھي! هو ميز ڇڏي ٿو، اسان ڪامياب ٿي ويا! ۽ جيتوڻيڪ ٿيلس کي اڪيلو ماني کائڻي هئي، مان سمجهان ٿو ته هو اسان تي چريو نه آهي :) توهان شايد محسوس ڪيو هوندو ته ميوٽڪس ۽ سيمفور جي وچ ۾ ڪجهه هڪجهڙائي. عام طور تي، انهن جو ساڳيو مقصد آهي: ڪجهه وسيلن تائين رسائي کي هم وقت سازي ڪرڻ. فرق صرف اهو آهي ته هڪ شئي جو ميوٽڪس صرف هڪ ٿريڊ ذريعي حاصل ڪري سگهجي ٿو هڪ وقت ۾، جڏهن ته هڪ سيمفور جي صورت ۾، هڪ ٿريڊ ڪائونٽر استعمال ڪيو ويندو آهي، ۽ انهن مان ڪيترائي هڪ ئي وقت وسيلن تائين رسائي حاصل ڪري سگهن ٿا. ۽ اهو صرف هڪ اتفاقي هڪجهڙائي ناهي :) حقيقت ۾، هڪ ميوٽڪس هڪ واحد جڳهه سيمفور آهي . اهو آهي، اهو هڪ سيمفور آهي جنهن جو ڪائونٽر شروعاتي طور تي 1 تي مقرر ڪيو ويو آهي. ان کي "بائنري سيمفور" پڻ سڏيو ويندو آهي ڇاڪاڻ ته ان جي ڪائونٽر ۾ صرف 2 قدر هوندا آهن - 1 ("مفت") ۽ 0 ("مصروف"). اهو ئي سڀ ڪجهه آهي! جئين توهان ڏسي سگهو ٿا، هر شيء تمام گهڻو پريشان نه ٿيو :) هاڻي، جيڪڏهن توهان انٽرنيٽ تي وڌيڪ تفصيل سان ملائي ٿريڊنگ جي موضوع جو مطالعو ڪرڻ چاهيو ٿا، اهو توهان لاء تصورات کي نيوڻ لاء ٿورو آسان ٿيندو. ايندڙ سبقن ۾ ملنداسين! release()
Semaphore
acquire()
release()
![هڪ ميوٽڪس، هڪ مانيٽر ۽ سيمفور جي وچ ۾ ڇا فرق آهي - 5](https://cdn.javarush.com/images/article/cd3b352a-d979-4826-84b7-0a0e5c836035/1024.jpeg)
GO TO FULL VERSION