გააზიარეთ რბოლის მდგომარეობა (race condition) და როგორ შეიძლება თავიდან აიცილოთ იგი მრავალთრაკიანი პროგრამებში.
sobes.tech AI
პასუხი AI-სგან
کثير سلسلہ جات کا نظام ڈیزائن میں ایک خامی ہے، جہاں پروگرام کے نتیجہ کا انحصار مختلف سلسلہ جات کے کوڈ کے حصوں کو انجام دینے کے ترتیب پر ہوتا ہے۔ یہ اس وقت ہوتا ہے جب کئی سلسلہ جات ایک ہی وقت میں مشترکہ متغیر وسائل تک رسائی حاصل کرتے ہیں بغیر مناسب ہم آہنگی کے۔
جاوا میں ریس کا مسئلہ سے بچاؤ کے لیے درج ذیل طریقے استعمال کیے جاتے ہیں:
-
ہم آہنگ شدہ طریقے اور بلاکس کا استعمال:
class Counter { private int count = 0; // ہم آہنگ شدہ طریقہ public synchronized void increment() { count++; } // ہم آہنگ شدہ بلاک public void decrement() { synchronized (this) { count--; } } }synchronizedکلیدی لفظ اس بات کو یقینی بناتا ہے کہ صرف ایک سلسلہ ایک وقت میں اس آبجیکٹ کے لیے ہم آہنگ شدہ کوڈ کو انجام دے سکتا ہے (یا کلاس کے لیے، اگر طریقہ سٹیٹک ہے)۔ -
Lockکلاس کا استعمالjava.util.concurrent.locksپیکج سے:import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class SafeCounter { private int count = 0; private final Lock lock = new ReentrantLock(); public void increment() { lock.lock(); // لاک حاصل کرنا try { count++; } finally { lock.unlock(); // لاک چھوڑنا } } }Lockزیادہ لچکدار میکانزم فراہم کرتا ہے مقابلے میںsynchronizedکے۔ -
java.util.concurrent.atomicپیکج سے اٹومک متغیرات کا استعمال:import java.util.concurrent.atomic.AtomicInteger; class AtomicCounter { private AtomicInteger count = new AtomicInteger(0); public void increment() { count.incrementAndGet(); // اٹومک آپریشن } }اٹومک متغیرات اٹومک آپریشنز فراہم کرتے ہیں (مثلاً، اضافہ، کمی)، جو ایک مکمل یونٹ کے طور پر انجام دیے جاتے ہیں اور دوسرے سلسلہ کے ذریعے روکے نہیں جاتے۔
-
java.util.concurrentپیکج سے تھریڈ سیف کلیکشنز کا استعمال: مثلاً،ConcurrentHashMap,CopyOnWriteArrayList۔ یہ کلیکشنز ملٹی تھریڈ ماحول میں محفوظ استعمال کے لیے ڈیزائن کی گئی ہیں۔ -
مشترکہ متغیر حالت سے بچاؤ: اگر ممکن ہو، تو وہ ڈیٹا جو کئی سلسلہ جات کے ذریعے رسائی حاصل کرتا ہے، غیر متغیر (immutable) ہونا چاہیے یا ہر سلسلہ کے لیے الگ کیا جانا چاہیے۔
-
volatileکا استعمال:volatileکلیدی لفظ متغیر میں تبدیلیوں کی مرئیت کو یقینی بناتا ہے تمام سلسلہ جات کے لیے، لیکن آپریشنز کی اٹومیکٹی کو فراہم نہیں کرتا (سوائے بنیادی اقسام کے پڑھنے اور لکھنے کے،longاورdoubleکے علاوہ، اور حوالہ جات کے لیے)۔ یہ دیگر میکانزم کے ساتھ مل کر یا سادہ، غیر حالت پر مبنی آپریشنز کے لیے مفید ہے۔class VolatileFlag { volatile boolean flag = false; // تبدیلیوں کی مرئیت کی ضمانت public void setFlag() { flag = true; } public boolean isFlag() { return flag; } }
مناسب طریقہ کا انتخاب مخصوص صورتحال اور کارکردگی اور کوڈ کی پیچیدگی کے مطالبات پر منحصر ہے۔