مضمون کو سمجھنے کے لیے ضروری علم کی سطح: آپ نے جاوا سنٹیکس اور جاوا کور کی تلاش مکمل کر لی ہے، اور اب جاوا ملٹی تھریڈنگ سیکھنے کے عمل میں ہیں۔ جاوا میں تعطل یا تعطل یا تعطل ایک ایسی خرابی ہے جو اس وقت ہوتی ہے جب تھریڈز کا ہم وقت ساز اشیاء کے جوڑے پر سائیکلک انحصار ہوتا ہے۔ تصور کریں کہ ایک دھاگہ آبجیکٹ مانیٹر میں جاتا ہے
اس صورت میں، دونوں دھاگے مسدود ہیں اور ہر ایک دوسرے کے تالے کے جاری ہونے کا انتظار کر رہا ہے۔ لیکن ان میں سے کوئی بھی ایسا نہیں کرے گا، کیونکہ ایسا کرنے کے لیے انہیں اپنا طریقہ مکمل کرنا ہوگا، اور اسے کسی اور تھریڈ نے بلاک کردیا ہے۔ تو وہ پھنس گئے جہاں یہ ہوا تھا
x
، اور دوسرا آبجیکٹ مانیٹر میں جاتا ہے y
۔ اگر کسی آبجیکٹ میں کوئی تھریڈ x
آبجیکٹ پر کسی بھی مطابقت پذیر طریقہ کو کال کرنے کی کوشش کرتا ہے y
، اور آبجیکٹ y
ایک ہی وقت میں آبجیکٹ پر کسی بھی مطابقت پذیر طریقہ کو کال کرنے کی کوشش کرتا ہے x
، تو تھریڈ انتظار میں پھنس جائیں گے۔ ڈیڈ لاک جیسے تصور کے بارے میں java docs ٹیوٹوریل کی ایک مثال ذیل میں ہے۔ یہاں تھریڈ بلاکنگ کہاں ہوتی ہے؟
public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.format("%s: %s" + " has bowed to me!%n", this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s"
+ " has bowed back to me!%n",
this.name, bower.getName());
}
}
public static void main(String[] args) {
final Friend alphonse =
new Friend("Alphonse");
final Friend gaston =
new Friend("Gaston");
new Thread(new Runnable() {
@Override
public void run() {
// System.out.println("Thread 1");
alphonse.bow(gaston);
// System.out.println("Th: gaston bowed to alphonse");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// System.out.println("Thread 2");
gaston.bow(alphonse);
// System.out.println("2.gaston waiting alph bowed");
}
}).start();
}
}
یہاں سمجھنے کے لیے دو اہم چیزیں ہیں:
- بیک وقت چلنے والے ہر تھریڈ بالکل کیا کرتا ہے؟
- کون سے تالے استعمال ہوتے ہیں؟
Friend
: alphonse
اور gaston
۔ ان میں سے ہر ایک کا اپنا تالا ہے۔ اس طرح، ان میں سے دو تالے ہیں: گیگولوس اور گیسٹن۔ جب کسی چیز کا مطابقت پذیر طریقہ داخل ہوتا ہے، تو اس کا تالا بند ہوجاتا ہے، اور جب طریقہ سے باہر نکلتا ہے، تو اسے جاری کیا جاتا ہے (یا غیر مقفل)۔ اب دھاگوں کے بارے میں۔ آئیے پہلے تھریڈ کو کال کریں Alphonse
(اسے آبجیکٹ الفونس سے ممتاز کرنے کے لیے بڑے حرف کے ساتھ)۔ یہ کیا کرتا ہے (آئیے اسے کہتے ہیں A
، مختصر کے لیے Alphonse
):
A: alphonse.bow(gaston) — получает лок alphonse;
A: gaston.bowBack(alphonse) — получает лок gaston;
A: возвращается из обоих методов, тем самым освобождая лок.
اور یہ ہے کہ اس وقت تھریڈ کیا کر رہا ہے Gaston
:
G: gaston.bow(alphonse) — получает лок gaston;
G: alphonse.bowBack(gaston) — получает лок alphonse;
G: возвращается из обоих методов, тем самым освобождая лок.
اب آئیے اس ڈیٹا کو ایک ساتھ رکھیں اور جواب حاصل کریں۔ دھاگوں کو مختلف ترتیبوں میں آپس میں جوڑا جا سکتا ہے (یعنی ان کے واقعات رونما ہوں گے)۔ ایک تعطل کام کرے گا، مثال کے طور پر، اگر حکم درج ذیل ہے:
A: alphonse.bow(gaston) — получает лок alphonse
G: gaston.bow(alphonse) — получает лок gaston
G: пытается вызвать alphonse.bowBack(gaston), но блокируется, ожидая лока alphonse
A: пытается вызвать gaston.bowBack(alphonse), но блокируется, ожидая лока gaston
deadlock
۔ تاہم، ایک اور بنائی بھی ممکن ہے، جس میں دھاگے میں سے ایک کو دوسرا شروع ہونے سے پہلے مکمل ہونے کا وقت ملے گا:
A: alphonse.bow(gaston) — получает лок alphonse
A: gaston.bowBack(alphonse) — получает лок gaston
A: возвращается из обоих методов, открывая оба лока
G: gaston.bow(alphonse) — получает лок gaston
G: alphonse.bowBack(gaston) — получает лок alphonse
G: возвращается из обоих методов, открывая оба лока
اس صورت میں، دھاگوں کی کوئی باہمی مسدودیت نہیں ہے۔ مثال کے طور پر، کچھ طریقہ شامل کیا گیا ہے جو کسی دوسرے دھاگے کو عمل میں لانے کا وقت دیتا ہے۔ جب نتیجہ بیک وقت رونما ہونے والے واقعات کی ترتیب پر منحصر ہوتا ہے (منصوبہ بند ترتیب یا عمل کی رفتار)، اس طرح کے عمل کو روسی میں ریس کی حالت کہا جاتا ہے - "ریس کنڈیشن"۔ ریس کے تمام حالات ممکنہ طور پر تعطل کا سبب نہیں بنتے، تاہم، میرے تجربے میں، صرف ریس کے حالات تعطل کا باعث بنتے ہیں۔ جواب دیا گیا: ڈیو للیتھون
اور کیا پڑھنا ہے: |
---|
جاوا ڈویلپر گروپ: ٹھنڈی SQL آپٹیمائزیشنز جو لاگت کے ماڈل پر منحصر نہیں ہیں۔ حصہ 1 |
GO TO FULL VERSION