Deadlocks, Starvation, and Race Conditions Java In Hindi
जावा प्रोग्रामिंग लैंग्वेज में जब एक समय में एक साथ मल्टीप्ल थ्रेड एक्सेक्यूट या रन होते हैं, तो इन थ्रेड टास्क में ज्यादातर प्रोग्राम डिक्लेअर वेरिएबल, ऑब्जेक्ट, फ़ाइल या डेटाबेस कनेक्शन जैसे थ्रेड टास्क रिसोर्स शेयर करने की ज़रूरत होती है। अगर मौजूदा थ्रेड प्रोग्राम में रिसोर्स का एक्सेस प्रॉपर आर्डर में मैनेज नहीं किया जा सकता है. तो ऐसी कंडीशन में डेडलॉक, स्टार्वेशन, और रेस कंडीशन जैसी थ्रेड प्रोब्लेम्स या इश्यूज जनरेट हो सकती हैं।

Deadlock condition in Java Threads.
जावा थ्रेड प्रोग्राम में डेडलॉक कंडीशन तब डेवलप होता है, जब किसी थ्रेड टास्क प्रोग्राम में दो या दो से अधिक थ्रेड टास्क हमेशा एक-दूसरे के सिस्टम रिसोर्स या लॉक रिलीज़ करने का वेट कर रहे होते हैं।
जावा थ्रेड डेडलॉक सिंपल वर्ड में जब थ्रेड टास्क 1, थ्रेड टास्क 2 का वेट कर रहा है, जबकि थ्रेड टास्क 2, थ्रेड टास्क 1 का वेट कर रहा है।
इसके परिणाम स्वरुप, कोई भी थ्रेड टास्क का एग्जीक्यूशन कंटिन्यू अल्लॉव नहीं कर सकता है।
Example of a deadlock in Java threads.
यहाँ माना की जावा यूजर के पास दो थ्रेड टास्क लॉक डिफाइन हैं.
ThreadObject lock1 = new ThreadObject();
ThreadObject lock2 = new ThreadObject();
यहाँ इस एक्साम्प्ल में थ्रेड टास्क 1, lock1 को लॉक कर सिक्योर करता है, इसके बाद lock2 का वेट करता है।
थ्रेड टास्क 2, lock2 को लॉक कर सिक्योर करता है, और फिर lock1 का वेट करता है।
class SampleDeadlock {
static ThreadObject lock1 = new ThreadObject();
static ThreadObject lock2 = new ThreadObject();
public static void main(String[] args) {
Thread th1 = new Thread(() -> {
synchronized (lock1) {
System.out.println(“Thread 1 Result – it locked lock1”);
synchronized (lock2) {
System.out.println(“Thread 1 Result – it locked lock2”);
}
}
});
Thread th2 = new Thread(() -> {
synchronized (lock2) {
System.out.println(“Thread 2 Result – it locked lock2”);
synchronized (lock1) {
System.out.println(“Thread 2 Result – it locked lock1”);
}
}
});
th1.start();
th2.start();
}
}
What happens in thread deadlock?
थ्रेड टास्क 1 थ्रेड टास्क 2
| |
v v
इसमें लॉक थ्रेड लॉक1 लॉक थ्रेड लॉक2
| |
v v
इसमें यूजर को थ्रेड lock2 चाहिए या थ्रेड lock1 चाहिए
| |
+——– WAIT ———+
इसमें थ्रेड टास्क 1 को lock2 नहीं मिल सकता है, क्योंकि इसमें थ्रेड टास्क 2 के पास मौजूद है।
इसी प्रकार थ्रेड टास्क 2 को lock1 नहीं मिल सकता है, क्योंकि इसमें थ्रेड टास्क 1 के पास है।
इस थ्रेड डेडलॉक कंडीशन में, दोनों थ्रेड लॉक का वेट करते रहते हैं।
How to avoid a deadlock condition in Java threads?
किसी जावा प्रोग्राम में एक थ्रेड टास्क एक बेसिक मेथड है, जिससे कि की जावा यूजर हमेशा एक ही ऑर्डर में थ्रेड टास्क लॉक को अचीव कर सकते है।
For example, always.
Thread task lock1 → Thread task lock2
and never.
Thread task lock2 → Thread task lock1
Starvation condition in Java Threads.
जावा थ्रेड प्रोग्राम में स्टार्वेशन कंडीशन तब जनरेट होती है, जब किसी यूजर डिफाइन थ्रेड टास्क को कन्टीन्यूस किसी सिस्टम प्रोग्राम रिसोर्स या CPU माइक्रोप्रोसेसर टाइम का एक्सेस नहीं प्रोवाइड किया जाता है. क्योंकि इस कंडीशन में सिस्टम को अन्य थ्रेड टास्क एक्टविटीज को एग्जीक्यूट करने का चांस या चॉइस आगे पीछे मिलता रहता है।
जावा थ्रेड स्टार्वेशन टास्क सिंपल वर्ड में, जब सिस्टम प्रोग्राम में एक थ्रेड टास्क करने के लिए रेडी टू स्टार्ट है. लेकिन फिर भी सिस्टम में उस टास्क को इग्नोर या अवॉयड किया जाता रहता है।
जैसे, माना की हमारे पास मल्टीप्ल थ्रेड सिस्टम में एक सिंक्रोनाइज़्ड सिस्टम रिसोर्स के लिए ट्राय कर रहे हैं। अगर ऐसी कंडीशन में एक थ्रेड टास्क बार-बार लॉक को हासिल करता है. जबकि इसी समय में अन्य थ्रेड टास्क लॉक के लिए सिस्टम का वेट करता रहता है. तो ऐसी कंडीशन में वेट कर रहे थ्रेड टास्क को स्टार्वेशन एक्सपीरियन्स फील हो सकता है।
Example of a conceptual thread task in Java.
Thread Task X → थ्रेड टास्क में X को सिस्टम प्रोग्राम का रिसोर्स मिलता है
Thread Task Y → यहाँ थ्रेड टास्क Y वेटिंग लिस्ट में है
Thread Task X → फिर से थ्रेड टास्क में X को सिस्टम प्रोग्राम का रिसोर्स मिलता है
Thread Task Y → इसमें फिर से थ्रेड टास्क Y वेटिंग लिस्ट में है
Thread Task X → फिर से थ्रेड टास्क में X को सिस्टम प्रोग्राम का रिसोर्स मिलता है
Thread Task Y → अभी भी थ्रेड टास्क Y वेटिंग लिस्ट में है
यहाँ ऊपर दिए गए थ्रेड टास्क में Y अभी भी बहुत ज़्यादा लंबे समय तक वेटिंग प्रोसेस में रह सकता है।
Main causes of Java thread starvation.
- खराब तरह के थ्रेड टास्क को शेड्यूलिंग करना
- फाल्स थ्रेड टास्क रिसोर्स का एलोकेशन करना
- जब कोई एक थ्रेड बहुत लॉन्ग टाइम तक लॉक वैल्यू को होल्ड करता है
- जब सिस्टम में किसी हाई-प्रायोरिटी थ्रेड्स टास्क को बार-बार CPU टाइम मिलता रहता है
- यूजर डिफाइन फाल्स सिंक्रोनाइज़ेशन/रिसोर्स को एक्सेस करना
How can Java thread starvation be reduced?
- प्रोग्राम थ्रेड टास्क को बेवजह लंबे समय तक लॉक होल्ड करने से बचें।
- हमेशा अपने सिंक्रोनाइज़्ड सेक्शन कोड को छोटा रखें।
- जरूरत पड़ने पर सही कंकरेंसी यूटिलिटीज़ का यूज़ करें।
- सिस्टम में थ्रेड टास्क प्रायोरिटीज़ पर बेवजह डिपेंड होने से बचें।
- प्रोग्राम सिस्टम रिसोर्स एक्सेस को सही तरीके से डिफाइन और डिज़ाइन करें।
Race Conditions in Java Threads.
जावा थ्रेड प्रोग्राम में रेस कंडीशन तब डेवलप होती है, जब एक सिस्टम CPU में मल्टीप्ल थ्रेड टास्क के लिए एक साथ शेयर किए गए डेटा को एक्सेस और मॉडिफ़ाई करते हैं, और फ़ाइनल रिज़ल्ट आउटपुट उन थ्रेड टास्क के एग्ज़िक्यूशन के रियल टाइम या ऑर्डर पर टोटली डिपेंड करता है।
जावा थ्रेड रेस कंडीशन टास्क सिंपल वर्ड में, जिसमे शेयर किए गए सिस्टम या प्रोग्राम डेटा टास्क को एक्सेस करने के लिए थ्रेड टास्क एक-दूसरे के साथ “रेस” या कम्पीटशन करते रहते हैं।
Example of a Race Condition.
यहाँ आप एक कंडीशन के बारे में सोचिए।
class Tester {
int count_value = 0;
void increase() {
count_value++;
}
}
यहाँ मान लीजिए की हम इस प्रोग्राम में दो थ्रेड टास्क एक ही समय पर एग्ज़िक्यूट करते हैं.
Tester.increase();
यहाँ आप इस थ्रेड टास्क में ये उम्मीद कर सकते हैं.
शुरुआती count_value = 0
Thread Task 1 → increase
Thread Task 2 → increase
अब इसमें फ़ाइनल count_value = 2
लेकिन इसमें count_value++ एक ऐसा ऑपरेशन नहीं है, जिसे अलग से डिफाइन नहीं किया जा सकता है। यहाँ डिफाइन कॉन्सेप्ट के हिसाब से, इसमें शामिल है.
रीड काउंट वैल्यू
↓
1 वैल्यू को जोड़ें
↓
नई काउंट वैल्यू को लिखें
थ्रेड टास्क इस तरह से चल सकते हैं.
थ्रेड टास्क 1 थ्रेड टास्क 2
रीड काउंट वैल्यू = 0
रीड काउंट वैल्यू = 0
1 वैल्यू को जोड़ें
1 वैल्यू को जोड़ें
1 वैल्यू को लिखें
1 वैल्यू को लिखें
फाइनल काउंट वैल्यू।
1
इसके बदले।
2
यह एक तरह से एक सिंपल रेस कंडीशन मेथड है।
Preventing a race condition in a thread task.
इस कंडीशन में जावा यूजर एक सिंक्रोनाइज़्ड कीवर्ड मेथड का यूज़ कर सकते हैं।
class Tester {
int count_value = 0;
synchronized void increase() {
count_value++;
}
}
अब यहाँ इस कंडीशन के बाद जावा यूजर एक समय में केवल एक थ्रेड एक ही टेस्टर ऑब्जेक्ट पर इनक्रीस() फंक्शन को रन कर सकते है।
इसमें एक और ऑप्शन डिफाइन है, सही प्रोग्राम ऑपरेशन के लिए एटॉमिक क्लास है, जैसे एटॉमिकइंटीजर का यूज़ करना।
import java.util.concurrent.atomic.AtomicInteger;
class Tester {
AtomicInteger count_value = new AtomicInteger(0);
void increase() {
count_value.increaseAndGet();
}
}
Main Difference Between Deadlock, Starvation, and Race Condition
| Situation | Each meaning | What is cause | Output |
| Deadlock | In deadlock user define threads task wait for each other forever | It causes circular lock dependency on your thread task | In this stage your threads task stops making progress |
| Starvation | In starvation mode a thread keeps waiting for a resource/cpu to allocate | It causes of unfair scheduling/resource allocation of cpu or program created task | In this stage one thread gets little or no progress during previous complete |
| Race condition | In race condition output result depends on timing of threads task execution process | It causes unsynchronized shared data access of resources | In this stage incorrect or unpredictable false output result |
An easy way to remember deadlock, starvation, and race conditions in Java programs.
Deadlock: A Java thread condition.
जावा थ्रेड डेडलॉक टास्क में “तुम मेरा इंतज़ार करो, मैं तुम्हारा इंतज़ार करूँगा।”
X → Y का इंतज़ार करता है
Y → X का इंतज़ार करता है
Starvation: A Java thread condition.
जावा थ्रेड स्टार्वेशन टास्क में “मेरे अलावा सबको सिस्टम प्रोग्राम या cpu रिसोर्स मिल जाता है।”
X → X थ्रेड टास्क को सिस्टम प्रोग्राम रिसोर्स मिलता है
X → X थ्रेड टास्क को सिस्टम प्रोग्राम रिसोर्स मिलता है
X → X थ्रेड टास्क को सिस्टम प्रोग्राम रिसोर्स मिलता है
Y → इस कंडीशन में Y थ्रेड टास्क का वेट करता रहता है
Race condition: A Java thread condition.
जावा रेस कंडीशन टास्क में “हम दोनों एक ही समय में एक ही एक ही प्रोग्राम सिस्टम डेटा को बदलते हैं।”
थ्रेड टास्क 1 ──┐
├──> शेयर्ड सिस्टम प्रोग्राम डेटा
थ्रेड टास्क 2 ──┘
Conclusion of Deadlocks, Starvation, and Race Conditions.
जावा थ्रेड टास्क में डेडलॉक एक ऐसी सिस्टम डिफाइन कंडीशन है, जहा दो या दो से अधिक थ्रेड टास्क एक-दूसरे के पास मौजूद रिसोर्स या लॉक का अनिश्चित समय तक वेट करते रहते हैं। यह थ्रेड टास्क को आगे बढ़ने से स्टॉप करता है।
जावा थ्रेड टास्क में स्टार्वेशन तब एक्टिवेट होता है, जब किसी थ्रेड टास्क को CPU का टाइम या ज़रूरी प्रोग्राम सिस्टम रिसोर्स का एक्सेस लगातार नहीं मिल पाता है. क्योंकि अन्य थ्रेड्स को बार-बार इसका एक्सेस मिलता रहता है।
जावा थ्रेड टास्क में रेस कंडीशन तब जनरेट होती है, जब कई यूजर डिफाइन थ्रेड्स एक साथ शेयर किए गए सिस्टम प्रोग्रा डेटा को एक्सेस और मॉडिफ़ाई करते हैं, और फ़ाइनल रिज़ल्ट थ्रेड एग्ज़िक्यूशन के टाइमिंग या ऑर्डर पर टोटली डिपेंड करता है। जावा में सिंक्रोनाइज़ेशन मैकेनिज़्म जैसे सिंक्रोनाइज़्ड, लॉक्स और एटॉमिक क्लास का यूज़ रेस कंडीशन को स्टॉप करने के लिए किया जा सकता है।
One-line summary of Deadlocks, Starvation, and Race Conditions.
- Deadlock stage → इस स्टेज में जावा प्रोग्राम क्रिएटेड थ्रेड्स हमेशा वेट करते हैं।
- Starvation stage → इस स्टेज में एक थ्रेड बहुत ज़्यादा वेट करता है।
- Race condition → इस स्टेज में एक साथ थ्रेड टास्क एक्सेस के कारण फाल्स रिज़ल्ट डिस्प्ले हो सकता है।

