जावा में एक सेमाफोर एक सिंक्रनाइज़ेशन सहायता है जो किसी भी समय किसी साझा संसाधन तक पहुंचने वाले थ्रेड्स की संख्या को प्रतिबंधित करता है। यह java.util.concurrent पैकेज का हिस्सा है और इसका उपयोग फ़ाइलों, डेटाबेस या नेटवर्क कनेक्शन जैसे संसाधनों तक समवर्ती पहुंच को प्रबंधित करने के लिए किया जाता है।
एक सेमाफोर परमिट की एक निर्धारित संख्या तक पहुंच को नियंत्रित करता है। प्रत्येक परमिट किसी विशेष संसाधन तक पहुँचने के अधिकार का प्रतिनिधित्व करता है। सेमाफोर उपलब्ध परमिटों की संख्या पर नज़र रखता है, जो यह निर्धारित करता है कि कितने थ्रेड एक साथ संसाधन तक पहुंच सकते हैं।
परमिट: एक टोकन या टिकट जो किसी थ्रेड को साझा संसाधन तक पहुंचने के साथ आगे बढ़ने की अनुमति देता है।
जब आप एक सेमाफोर बनाते हैं, तो आप उपलब्ध परमिटों की संख्या निर्दिष्ट करते हैं। यह संख्या परिभाषित करती है कि कितने थ्रेड एक साथ संसाधन तक पहुंच सकते हैं।
इससे पहले कि कोई थ्रेड संसाधन तक पहुंच सके, उसे सेमाफोर से परमिट प्राप्त करना होगा। यह acquire() विधि का उपयोग करके किया जाता है।
अधिग्रहण : यह विधि तब कॉल की जाती है जब कोई थ्रेड संसाधन तक पहुंचना चाहता है। यदि कोई परमिट उपलब्ध है, तो सेमाफोर उपलब्ध परमिटों की संख्या कम कर देता है और थ्रेड को आगे बढ़ने की अनुमति देता है। यदि कोई परमिट उपलब्ध नहीं है, तो परमिट उपलब्ध होने तक थ्रेड को ब्लॉक कर दिया जाता है।
व्यवहार को अवरुद्ध करना: यदि कोई परमिट उपलब्ध नहीं है, तो अधिग्रहण() को कॉल करने वाला थ्रेड ब्लॉक कर दिया जाएगा (यानी, यह इंतजार करेगा) जब तक कि कोई अन्य थ्रेड परमिट जारी नहीं करता।
एक बार जब कोई थ्रेड संसाधन का उपयोग करना समाप्त कर लेता है, तो उसे इसे अन्य थ्रेड के लिए उपलब्ध कराने के लिए परमिट जारी करना चाहिए। यह release() विधि का उपयोग करके किया जाता है।
रिलीज़ : यह विधि उपलब्ध परमिटों की संख्या बढ़ाती है। यदि कोई थ्रेड परमिट की प्रतीक्षा कर रहा है, तो उनमें से एक को अनब्लॉक कर दिया जाएगा और परमिट प्राप्त करने की अनुमति दी जाएगी।
जावा में दो प्रकार के सेमाफोर हैं:
सेमाफोर कैसे काम करते हैं, इसे बेहतर ढंग से समझने के लिए, आइए एक व्यावहारिक कार्यान्वयन पर नजर डालें। हम एक सरल परिदृश्य बनाएंगे जहां एकाधिक थ्रेड सीमित संसाधन तक पहुंचने का प्रयास करेंगे।
import java.util.concurrent.Semaphore; public class SemaphoreDemo { // Creating a semaphore with 3 permits private static final Semaphore semaphore = new Semaphore(3); public static void main(String[] args) { // Creating and starting 6 threads for (int i = 1; i2.2 संहिता की व्याख्या
इस उदाहरण में, हम तीन परमिट के साथ एक सेमाफोर बनाते हैं, जिसका अर्थ है कि किसी भी समय केवल तीन थ्रेड कोड के महत्वपूर्ण अनुभाग तक पहुंच सकते हैं। फिर हम छह धागे बनाते हैं, जिनमें से सभी परमिट प्राप्त करने का प्रयास करते हैं। एक बार जब कोई थ्रेड परमिट प्राप्त कर लेता है, तो यह परमिट जारी करने से पहले दो सेकंड के लिए सोकर कुछ काम का अनुकरण करता है।
2.3 आउटपुट का अवलोकन करना
जब आप उपरोक्त कोड चलाएंगे, तो आउटपुट कुछ इस तरह दिखेगा:
Worker 1 is trying to acquire a permit... Worker 1 acquired a permit. Worker 2 is trying to acquire a permit... Worker 2 acquired a permit. Worker 3 is trying to acquire a permit... Worker 3 acquired a permit. Worker 4 is trying to acquire a permit... Worker 5 is trying to acquire a permit... Worker 6 is trying to acquire a permit... Worker 1 is releasing a permit. Worker 4 acquired a permit. Worker 2 is releasing a permit. Worker 5 acquired a permit. Worker 3 is releasing a permit. Worker 6 acquired a permit.यहां, पहले तीन थ्रेड सफलतापूर्वक परमिट प्राप्त करते हैं और अपना कार्य शुरू करते हैं। शेष थ्रेड्स को आगे बढ़ने से पहले परमिट जारी होने तक इंतजार करना होगा।
2.4 व्यावहारिक उपयोग के मामले
सेमाफोर उन परिदृश्यों में विशेष रूप से उपयोगी होते हैं जहां आपको किसी विशेष संसाधन तक समवर्ती पहुंच की संख्या को सीमित करने की आवश्यकता होती है, जैसे:
हालांकि सेमाफोर एक शक्तिशाली उपकरण हैं, वे अपने फायदे और नुकसान के साथ आते हैं।
लचीलापन : सेमाफोर एकाधिक थ्रेड द्वारा संसाधन पहुंच पर सटीक नियंत्रण की अनुमति देता है।
स्केलेबिलिटी : सेमाफोर आसानी से बड़ी संख्या में संसाधनों तक पहुंच का प्रबंधन कर सकता है।
निष्पक्षता : यह सुनिश्चित करने के लिए कि थ्रेड निष्पक्ष तरीके से परमिट प्राप्त करते हैं, सेमाफोर को कॉन्फ़िगर किया जा सकता है।
जटिलता : सेमाफोर का उपयोग करने से आपके कोड में जटिलता आ सकती है, जिससे इसे डीबग करना कठिन हो जाता है।
गतिरोध : यदि सही ढंग से नहीं संभाला जाता है, तो सेमाफोर गतिरोध का कारण बन सकता है जहां थ्रेड्स परमिट के इंतजार में अनिश्चित काल तक अवरुद्ध हो जाते हैं।
सामान्य नुकसान से बचने और सेमाफोर का अधिकतम लाभ उठाने के लिए, निम्नलिखित सर्वोत्तम प्रथाओं पर विचार करें:
अधिग्रहण() का उपयोग करने के बजाय, जो अनिश्चित काल तक ब्लॉक करता है, आप टाइमआउट के साथ परमिट प्राप्त करने का प्रयास करने के लिए प्रयासएक्वायर() का उपयोग कर सकते हैं। यह थ्रेड्स को प्रतीक्षा में अटकने से बचाता है।
if(semaphore.tryAcquire(1000, TimeUnit.MILLISECONDS)) { try { // Critical section } finally { semaphore.release(); } }
संसाधन लीक से बचने के लिए, परमिट को हमेशा अंततः ब्लॉक में जारी करें। यह सुनिश्चित करता है कि अपवाद होने पर भी परमिट जारी किया जाता है।
यदि आपको किसी संसाधन को केवल एक थ्रेड के लिए लॉक और अनलॉक करने की आवश्यकता है, तो बाइनरी सेमाफोर के बजाय रीएंट्रेंटलॉक या सिंक्रोनाइज़ का उपयोग करने पर विचार करें।
सेमाफोर जावा में समवर्ती प्रबंधन के लिए एक शक्तिशाली उपकरण है, जो आपको साझा संसाधन तक पहुंचने वाले थ्रेड की संख्या को नियंत्रित करने की अनुमति देता है। इस आलेख में उल्लिखित तकनीकों और सर्वोत्तम प्रथाओं का पालन करके, आप सुरक्षित और कुशल संसाधन प्रबंधन सुनिश्चित करने के लिए अपने जावा अनुप्रयोगों में सेमाफोर को प्रभावी ढंग से लागू कर सकते हैं।
यदि आपके कोई प्रश्न हैं या आप सेमाफोर्स के साथ अपने अनुभव साझा करना चाहते हैं, तो बेझिझक नीचे टिप्पणी करें!
यहां अधिक पोस्ट पढ़ें: सेमाफोर का उपयोग करके जावा में कॉन्करेंसी प्रबंधित करने की तकनीक
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3